《JAVA与模式》之组合模式

定义(GoF《设计模式》):

将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。

及角色:
  1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
子部件。
  2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
  3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除

(remove)等。


 1 public static void main(String[] args) {
 2
 3         Component component=new Composite("根节点");
 4         Component child=new Composite("一级子节点child");
 5         Component child_1=new Leaf("一级子节点child之子节点一");
 6         Component child_2=new Leaf("一级子节点child之子节点二");
 7         child.add(child_1);
 8         child.add(child_2);
 9         Component child2=new Composite("一级子节点child2");
10         component.add(child);
11         component.add(child2);
12         component.foreach();
13     }
14
15 }
16  abstract class Component {
17
18      String name;
19
20      public Component(String s){
21
22          this.name=s;
23      }
24      public abstract void add(Component c);
25      public abstract void remove(Component c);
26      public abstract void foreach();
27  }
28 //组合类
29  class Composite extends Component{
30     private List<Component>child=new ArrayList<Component>
31     ();
32
33     public Composite(String s) {
34         super(s);
35         // TODO Auto-generated constructor stub
36     }
37
38     @Override
39     public void add(Component c) {
40         child.add(c);
41
42     }
43
44     @Override
45     public void foreach() {
46         // TODO Auto-generated method stub
47         System.out.println("节点名:\t"+name);
48         for (Component c : child) {
49             c.foreach();
50         }
51     }
52
53     @Override
54     public void remove(Component c) {
55         // TODO Auto-generated method stub
56         child.remove(c);
57     }
58
59  }
60  //不在有根节点
61  class Leaf extends Component{
62
63     public Leaf(String s) {
64         super(s);
65
66     }
67
68     @Override
69     public void add(Component c) {
70         // TODO Auto-generated method stub
71
72     }
73     @Override
74     public void foreach() {
75         System.out.println("tself name-->"+this.name);
76     }
77
78     @Override
79     public void remove(Component c) {
80         // TODO Auto-generated method stub
81
82     }
83
84  }

执行结果:

节点名: 根节点
节点名: 一级子节点child
tself name-->一级子节点child之子节点一
tself name-->一级子节点child之子节点二
节点名: 一级子节点child2



什么情况下使用组合模式

引用大话设计模式的片段:“当发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑组合模式了。”

参考地址:

http://blog.csdn.net/jason0539/article/details/22642281

http://blog.csdn.net/guolin_blog/article/details/9153753

http://www.2cto.com/kf/201206/137680.html

《JAVA与模式》之组合模式,布布扣,bubuko.com

时间: 2024-10-16 07:14:17

《JAVA与模式》之组合模式的相关文章

迭代器模式和组合模式混用

迭代器模式和组合模式混用 前言 园子里说设计模式的文章算得上是海量了,所以本篇文章所用到的迭代器设计模式和组合模式不提供原理解析,有兴趣的朋友可以到一些前辈的设计模式文章上学学,很多很有意思的.在Head First 设计模式这本书中,也有说迭代和组合模式混用的方法,但是使用的语言是JAVA,实现起来比起C#差异还是不少.本人在做几个C#小项目的时候需要用到树形结构,也看到了Head First 设计模式中混用迭代器和组合模式的例子,觉得如果能用C#实现,以后无疑会带来很大的帮助.下面就记录下实

(38)23种设计模式研究之九【迭代器模式和组合模式】

一.定义 迭代器可以认为是一个指针,可以遍历容器的指针.迭代器(iterator)有时又称游标(cursor)是程式设计的软件设计模式,可在容器物件(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器物件的内容迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址.迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器.然而迭代器有很多不同的能力,它可以把抽象容器和

12结构型模式之组合模式

概念 Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 角色和职责 Component (树形结构的节点抽象) - 为所有的对象定义统一的接口(公共属性,行为等的定义) - 提供管理子节点对象的接口方法 - [可选]提供管理父节点对象的接口方法 Leaf (树形结构的叶节点) Component的实现子类 Composite(树形结构的枝节点) Component的实现子类 适用于: 单个对象和组合对象的使用具有一

java设计模式 GOF23 09 组合模式

一.组合模式简介 把整体和部分的关系用树形结构表示,从而可以统一处理. 二.组合模式实现细节 1)抽象构建:定义叶子和容器的共同特点. 2)叶子:没有子节点 3)容器:有容器的特征,可以包含子节点(一般实现的时候在这里添加容器存放子节点) 三.简单代码实现 package com.lz.combination; import java.util.ArrayList; import java.util.List; /* * 抽象构建 */ public interface IComponent {

Java设计模式之《组合模式》及应用场景

摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6489827.html 组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推.很明显,这是树形结构,终结点叫叶子节点,非终节点(组节点)叫树枝节点,第一个节点叫根节点.同时也类似于

迭代器模式和组合模式

迭代器模式: 提供一种方法顺序访问聚合对象内的各个元素,而又不暴露其内部的表示 实现Iterator接口的hasNext()以及next()方法 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构,组合能让客户以一致的方式处理个别对象以及对象组合

设计模式-迭代器模式和组合模式

1.迭代器模式完成的功能是和迭代器一样的,封装了对对象的顺序遍历,因为子类的对象集合的存储方式可能并不一致.但是存储的对象是一致的. public classItem{ .....//各种属性 } public class Set1{ item[] items; ... public Iterator createIterator(){ return new ItemIterator(items); } } public class Set2{ ArrayList items; ... publ

结构型模式之组合模式

概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理.由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们,因为对于这些对象的区别对待将会使得程序非常复杂.组合模式为解决此类问题而诞生,它可以让叶子对象和容器对象的使用具有一致性 定义 组合模式(Co

迭代器模式,组合模式 -- 学习HeadFirst设计模式记录

迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 组合模式   :允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 单一原则:一个类应该只有一个引起变化的原因. 迭代器模式示例代码:   #include <iostream>#include <iomanip>  // cout格式控制#include <string>#include <vector&

C++外观模式和组合模式

外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来.客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构.DP一书的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析.语法分析.中间代码生成.机器码生成.学过编译都知道,每一步都很复杂.对于编译器这个系统,就可以使用外观模式.可以定义