设计模式-组合模式(Composite Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/

前置技能:认识数据结构中的树形结构。

组合模式简介

组合模式是将对象组合成树形结构以表示“部分-整体”的层次结构,每一个节点可以是叶子节点也可以使包含一堆子节点的中间节点,而且所有的节点都有同样的接口,用户在使用的时候无需区分节点类型,也就是可以将整个结构的任意部分当成“整体”来处理,这就是组合模式带来的方便。

 

组合模式的定义和基本结构

定义:将对象组合成树形结构以表示“部分-整体”的层次结构,并且为不同类型的节点提供完全相同的接口,让用户可以将整个结构的任意部分当成“整体”来处理。

一张来自《Head First》的结构图

Client:用户类,通过Component操作组合模式中的节点。

Component:组合模式中树状结构的每一个节点都要实现的接口,提供基本操作。

Leaf:树状结构中的叶子节点。

Composite:树状结构中的非叶子结点。

注意:我们可以看到,Component接口中有很多方法只适合于Composite而不适合Leaf,所以在Leaf中我们需要做好相应的处理工作,来让使用者感受不到差异的同时又不产生运行错误或者逻辑错误,如leaf没有孩子,我们可以让getChild方法直接抛出异常,或者返回null,一切都要结合实际使用背景来设计合适的处理逻辑。

一个简单的实例(java)

我们就实现一个纯的结构吧,每一个节点都包含一个字符串,Composite节点包含子节点,每个节点都可以打印自己的字符串,也可以一并打印自己所有子节点的字符串。

首先我们要定义一个Component。

 1 public abstract class Component{
 2     private String s;
 3     public Component(String s){
 4         this.s=s;
 5     }
 6     public String getString() {
 7         return s;
 8     }
 9     public void print() {
10         System.out.println(getString());
11     }
12     public abstract void printAll();
13     public abstract void remove(Component s);
14     public void add(Component s) {
15         new UnsupportedOperationException();
16     }
17     public Component getChild(int i) {
18         new UnsupportedOperationException();
19         return null;
20     }
21 }

然后我们实现MyComposite类,这里储存子节点借用了ArrayList。

 1 import java.util.ArrayList;
 2 public class MyComposite extends Component {
 3     private ArrayList<Component> list;
 4     public MyComposite(String s) {
 5         super(s);
 6         list=new ArrayList<Component>();
 7     }
 8     @Override
 9     public void printAll() {
10         System.out.println(getString()+"---------------"+"start");
11         for(Component c:list)
12             c.printAll();
13         System.out.println(getString()+"---------------"+"end");
14     }
15     @Override
16     public void add(Component s) {
17         list.add(s);
18     }
19     @Override
20     public void remove(Component s) {
21         if(!list.remove(s)){
22             for(Component c:list)
23                 c.remove(s);
24         }
25     }
26     @Override
27     public Component getChild(int i) {
28         if(i<list.size())
29             return list.get(i);
30         new IndexOutOfBoundsException();
31         return null;
32     }
33 }

然后实现MyLeaf,这个相对简单。

 1 public class MyLeaf extends Component {
 2     public MyLeaf(String s) {
 3         super(s);
 4     }
 5     public void printAll() {
 6         print();
 7     }
 8     @Override
 9     public void remove(Component s) {
10     }
11 }

然后是测试类。

 1 public class Test {
 2     public static void main(String[] args) {
 3         Component root=new MyComposite("1-root");
 4         root.add(new MyLeaf("2-1-Leaf"));
 5         root.add(new MyComposite("2-2-Composite"));
 6         Component r=new MyComposite("3-1-composite");
 7         root.getChild(1).add(r);
 8         root.getChild(1).add(new MyLeaf("3-2-leaf"));
 9         root.getChild(1).add(new MyLeaf("3-3-leaf"));
10
11         root.getChild(1).getChild(0).add(new MyLeaf("4-1-leaf"));
12         Component r2=new MyLeaf("4-2-leaf");
13         root.getChild(1).getChild(0).add(r2);
14         root.getChild(1).getChild(0).add(new MyLeaf("4-3-leaf"));
15         root.getChild(1).getChild(0).add(new MyLeaf("4-4-leaf"));
16         root.printAll();
17         System.out.print("**************************************");
18         root.print();
19         root.remove(r2);
20         root.printAll();
21         System.out.print("**************************************");
22         root.print();
23         root.remove(r);
24         root.printAll();
25         System.out.print("**************************************");
26         root.print();
27     }
28 }

输出如下:

小结:这个模式理解起来并不困难,重点在于了解树形结构,然后掌握递归调用的写法,剩下的就相当简单了。

组合模式到此结束,?(^∇^*)

参考资料:《Head First 设计模式》。

时间: 2024-10-11 05:37:21

设计模式-组合模式(Composite Pattern)的相关文章

设计模式 - 组合模式(composite pattern) 详解

组合模式(composite pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方法处理个别对象以及组合对象. 建立组件类(Component), 组合类(composite)和叶子类(leaf)继承组件类, 客户类(client)直接调用最顶层的组合类(composite)即可. 具体方法: 1. 组件类(component), 包含组合

设计模式 - 组合模式(composite pattern) 迭代器(iterator) 详解

组合模式(composite pattern) 迭代器(iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考组合模式(composite pattern): http://blog.csdn.net/caroline_wendy/article/details/36895627 在组合模式(composite pattern)添加迭代器功能, 遍历每一个组合(composite)的项. 具体方法: 1. 抽象组件类(abstract

设计模式 -- 组合模式 (Composite Pattern)

定义: 对象组合成部分整体结构,单个对象和组合对象具有一致性. 看了下大概结构就是集团总公司和子公司那种层级结构. 角色介绍: Component :抽象根节点:其实相当去总公司,抽象子类共有的方法: Composite :相当于总公司的智能部门,也分管子公司,通过集合存储子节点对象,提供增删获取子节点对象的方法: leaf:子节点,相当于集团子公司,总公司具有的智能,子公司也具有,因此子节点具有总节点拥有的所有抽象方法以及提供给子类的方法. Client:通过抽象跟节点操作子节点的对象.

设计模式之组合模式---Composite Pattern

模式的定义 组合模式(Composite Pattern)定义如下: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性.

说说设计模式~组合模式(Composite)

返回目录 何时能用到它? 组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦.对于今天这个例子来说,它可以很清楚的说明组合模式的用意,首先是一个Graphics对象,它表示是一绘图功能(树根),而circle,line和rectangle分别是简单的图形,它们内部不能再有其它图形了(相当于树叶),而picture是一个复杂图形,它由circle,line和rectangle组成(相当于树

组合模式(Composite Pattern)

转:http://www.cnblogs.com/doubleliang/archive/2011/12/27/2304104.html 简而言之,就是让所有的叶子节点执行相同的操作!!!!!!!!!!!!!!! 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

设计模式之八:组合模式(Composite Pattern)

什么是组合模式呢?简单来说组合模式就是将对象合成树形结构以表示"部分整体"的层次结构,组合模式使用户对单个对象和组合对象使用具有一致性. 组合模式(Composite Pattern)有时候又叫部分-整体模式,它使我们在树型结构的问题中,模糊了简单元素和负责元素的概念,客户程序可以向处理简单元素一样处理负责元素,从而使得客户程序与复杂元素的的内部结构解耦. 组合模式让你可以优化处理递归或分级数据结构.关于分级数据结构的一个经典例子就是电脑中的文件系统.文件系统由目录和文件组成,所有目录

设计模式 -- 组合模式(Composite)

写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识组合模式,包括:定义.结构.参考实现 体会组合模式,包括:场景问题.不用模式的解决方案.使用模式的解决方案 理解组合模式,包括:认识组合模式.安全性和透明性.父组件引用.环状引用.组合模式的优缺点 思考组合模式,包括:组合模式的本质.何时选用 参考内容: 1.<研磨设计模式> 一书,作者:陈臣.王斌 --

设计模式组合模式(Composite)精华

23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建立也将委托实例化一个对象. 创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此.创建型模式在什么被创建.谁创建它,它是怎样被创建的,以及何时创建这些方