组合(Composite)模式
定义
Composite模式是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体“的层次结构,并使用户对单个对象和组合对象的使用具有一致性。
动机
当处理树形结构的数据时,我们常常需要区别对待叶子结点和内部结点,这使得代码更加复杂,以至于容易出错。因此,如果有一种方法,可以使我们可以统一处理叶子结点和内部结点,那么,对于我们提高代码的质量是十分有帮助的。
Composite模式正是这样一种设计模式,它可以使我们以统一的方式去处理叶子结点(单个对象)和内部结点(组合对象)。
适用性
当你想表示“部分-整体“的层次结构,并希望忽略组合对象和单个对象不同,可以使用统一的方式来处理组合结构中的所有对象。
结构
Compenent
- 所有对象的抽象,包括组合对象和单个对象
- 声明对象的接口
Leaf
- 表示单个对象
- 实现所有的Compent接口
Composite
- 代表组合对象
- 实现所有的Compent接口
- 还包括了对其孩子对象进行操作的接口
例子
在下面的例子中,我们实例一个图形系统。图形可以是椭圆(Ellipse)或者复合图形(CompositeGraphic),每个图形都可以打印出来,打印接口在Graphic接口中声明。
这个图形系统是易于扩展的,例如加入矩形,圆形等,也可以加入其他的方法,例如缩放等。
Graphic.java
/** "Component" */
interface Graphic {// Prints the graphic.public void print();
}
CompositeGraphic.java
/** "Composite" */
import java.util.List;
import java.util.ArrayList;
class CompositeGraphic implements Graphic {// Collection of child graphics.private List<Graphic> childGraphics = new ArrayList<Graphic>();// Prints the graphic.public void print() {for (Graphic graphic : childGraphics) {graphic.print();}}// Adds the graphic to the composition.public void add(Graphic graphic) {childGraphics.add(graphic);}// Removes the graphic from the composition.public void remove(Graphic graphic) {childGraphics.remove(graphic);}
}
Ellipse.java
/** "Leaf" */
class Ellipse implements Graphic {// Prints the graphic.public void print() {System.out.println("Ellipse");}
}
最后是使用这套图形系统的测试程序。它首先初始化4个椭圆(ellipse1, ellipse2, ellipse3, ellipse4),然后构造2个复合图形(graphic1, graphic2),再使用这2个复合图形来构造一个复合图形(graphic),最后使用Graphic接口(print)来将graphic图形打印出来:
Program.java
/** Client */
public class Program {public static void main(String[] args) {// Initialize four ellipsesEllipse ellipse1 = new Ellipse();Ellipse ellipse2 = new Ellipse();Ellipse ellipse3 = new Ellipse();Ellipse ellipse4 = new Ellipse();// Initialize three composite graphicsCompositeGraphic graphic = new CompositeGraphic();CompositeGraphic graphic1 = new CompositeGraphic();CompositeGraphic graphic2 = new CompositeGraphic();// Composes the graphicsgraphic1.add(ellipse1);graphic1.add(ellipse2);graphic1.add(ellipse3);graphic2.add(ellipse4);graphic.add(graphic1);graphic.add(graphic2);// Prints the complete graphic (four times the string "Ellipse").graphic.print();}
}
输出:
Ellipse
Ellipse
Ellipse
Ellipse
参考资料
- https://en.wikipedia.org/wiki/Composite_pattern
- http://www.tutorialspoint.com/design_pattern/composite_pattern.htm
- http://baike.baidu.com/view/3591789.htm
组合(Composite)模式相关推荐
- 设计模式学习笔记——组合(Composite)模式
设计模式学习笔记--组合(Composite)模式 @(设计模式)[设计模式, 组合模式, composite] 设计模式学习笔记组合Composite模式 基本介绍 组合案例 类图 实现代码 Ent ...
- 设计模式---组合Composite模式
1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.动机 在绘图编辑器和图形捕捉系统这样的图形应用程 ...
- 八、结构模式之组合(Composite)模式
组合模式属于对象的结构模式,有时又叫做部分-整体模式,组合模式将对象组织到树结构中,可以用来描述整体与部分的联系.其可以使客户端将单纯元素和组合元素同等对待. 当需求中是体现部分与整体层次的结构时,以 ...
- Java设计模式之组合Composite模式代码示例
- 设计模式之组合模式(Composite 模式)
引入composite模式 在计算机文件系统中,有文件夹的概念,文件夹里面既可以放入文件也可以放入文件夹,但是文件中却不能放入任何东西.文件夹和文件构成了一种递归结构和容器结构. 虽然文件夹和文件是不 ...
- Java设计模式(8)组合模式(Composite模式)
Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...
- COMPOSITE(组合)模式
1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性. 2.动机 在绘图编辑器和图形捕捉系统这样的图形应 ...
- Java组合实体模式
组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中.一个组合实体是一个 EJB 实体 bean,代表了对象的图解.当更新一个组合实体时,内部依赖对象 beans ...
- 结构型模式之Composite模式
1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.适用性 以下情况使用Composite模式 (1 ...
最新文章
- 2020德勤面试开始了吗_2020下半年教师资格证面试时间已出!12月10日开始报名
- 知识图谱要看的书 了解的人 公众的号
- sql 拼接int类型的字段_SQL 基础教程—第一章:4. 表的创建
- 信息系统项目管理师-论文专题(二)整体管理论文写作
- Web.Config介绍
- Visual Studio Code 中文下载
- ztree改变节点颜色
- pwm控制的基本原理_单片机PWM控制基本原理详解~
- HDU 4873 ZCC Loves Intersection(可能性)
- css 行内水平均等排布方式
- idea项目(git)版本回退
- [cdq分治][树状数组] Bzoj P3262 陌上花开
- Power oj2498/DP/递推
- 主成分分析——SPSS实操
- 小白如何搭建自己的网络服务器
- Linux虚拟主机管理系统---wdcp
- 第五章 图像基础(设备内容)
- Python--print(xx)内容为空,打印不出内容;原因是文件句柄对象在迭代后,对象内的数据会逐渐清空
- muduo源码剖析——Singleton单例模式之懒汉模式与DCL双重检查
- 计算机基础——Windows 7操作系统