Composite 组合模式
| Markdown版本笔记 | 我的GitHub首页 | 我的博客 | 我的微信 | 我的邮箱 |
|---|---|---|---|---|
| MyAndroidBlogs | baiqiantao | baiqiantao | bqt20094 | baiqiantao@sina.com |
目录
组合模式
简介
将对象组合成【树】形结构以表示【部分-整体】的层次结构,组合模式使得用户对【单个对象】和对【组合对象】的使用具有一致性。
将对象组合成【树】形结构以表示【部分-整体】的层次结构,组合模式使得用户对【单个对象】和对【组合对象】的使用具有一致性。
组合模式有时候又叫做部分-整体模式,它使我们在树型结构的问题中,模糊了简单元素和复杂元素的概念。
当发现需求中是体现部分与整体层次结构,并且你希望用户可以忽略组合对象与单个对象的不同,以统一的方式使用组合结构中的所有对象时,就应该考虑组合模式了。
组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。
组合模式让你可以优化处理【递归】或【分级】数据结构。
关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的文件系统。文件系统由目录和文件组成,每个目录都可以装内容,目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式。
涉及角色:
- Component:为参加组合的对象声明一个公共接口,不管是组合还是叶结点都实现这个接口
- Leaf:在组合中表示叶子结点对象,叶子结点没有子结点
- Composite:表示组合中有子结点的对象
特点:使得客户端看来单个对象和对象的组合是同等的。换句话说,某个类型的方法同时也接受自身类型作为参数。
例如:
java.util.List#addAll(Collection)
案例
Component:为参加组合的对象声明一个公共接口
public abstract class Component {
/**表示直接叶子节点(直接下属团队成员)的集合 */
protected List<Component> employList;
public String name;
public final void display() {
System.out.println(name);//打印自己
display(employList);//打印子节点
}
private final void display(List<Component> list) {
if (list != null) {
for (int i = 0; i < list.size(); i++) {
Component sonComponent = list.get(i);//子节点
System.out.println(sonComponent.name);//打印子节点
List<Component> sonList = sonComponent.employList;//子节点的节点集合
if (sonList != null) {//不为空说明是非叶子节点
display(sonList); //递归
}
}
}
}
public abstract boolean add(Component employer);
public abstract boolean delete(Component employer);
}
Leaf:组合中的叶子结点对象,叶子结点没有子结点
public class Leaf extends Component {
public Leaf(String name) {
this.name = name;
this.employList = null;//没有叶子节点
}
@Override
public boolean add(Component employer) {
throw new RuntimeException("叶子结点没有子结点");
}
@Override
public boolean delete(Component employer) {
throw new RuntimeException("叶子结点没有子结点");
}
}
Composite:组合中有子结点的对象
public class Composite extends Component {
public Composite(String name) {
this.name = name;
this.employList = new ArrayList<Component>();
}
@Override
public boolean add(Component employer) {
return this.employList.add(employer);
}
@Override
public boolean delete(Component employer) {
return this.employList.remove(employer);
}
}
演示
public class Test {
public static void main(String[] args) {
Component employer1 = new Composite("【项目经理一】");
Component employer11 = new Leaf("包青天");
Component employer12 = new Leaf("白乾涛");
Component employer13 = new Leaf("baiqiantao");
Component employer2 = new Composite("【项目经理二】");
Component employer21 = new Leaf("bqt");
Component employer3 = new Composite("boss");
employer3.add(employer1);// 为boss添加一个非叶子节点
employer3.add(employer2);
employer1.add(employer11);// 为项目经理添加一个叶子节点
employer1.add(employer12);
employer1.add(employer13);
employer2.add(employer21);
employer11.display();
System.out.println("----------------------------------");
employer1.display();
System.out.println("----------------------------------");
employer2.display();
System.out.println("----------------------------------");
employer3.display();
System.out.println("----------------------------------");
System.out.println(employer2.add(employer21));//true
System.out.println(employer2.delete(employer11));//false
employer2.display();
}
}
2016-10-31
Composite 组合模式的更多相关文章
- C++设计模式-Composite组合模式
Composite组合模式作用:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. UML图如下: 在Component中声明所有用来 ...
- 十一、Composite 组合模式
原理: 代码清单 Entity public abstract class Entry { public abstract String getName(); public abstract int ...
- Composite组合模式(结构型模式)
1.概述 在面向对象系统中,经常会遇到一些具有"容器性质"的对象,它们自己在充当容器的同时,也充当其他对象的容器. 2.案例 需要构建一个容器系统,需要满足以下几点要求: (1). ...
- 设计模式08: Composite 组合模式(结构型模式)
Composite 组合模式(结构型模式) 对象容器的问题在面向对象系统中,我们常会遇到一类具有“容器”特征的对象——即他们在充当对象的同时,又是其他对象的容器. public interface I ...
- 一天一个设计模式——Composite组合模式
一.模式说明 能够使容器与内容物具有一致性,创造出递归结构的模式就是Composite组合模式. 举个例子:计算机中的文件系统中有文件和文件夹的概念,我们知道,文件夹可以包含文件,也可以包含子文件夹, ...
- java实现Composite(组合)模式
组合模式涉及的是一组对象,其中一些对象可能含有其他对象,这些对象也可以含有对象,因此,有些对象代表的是对象群组. Composite模式的设计意图在于:让所有的用户能够用统一的接口处理单个对象以及对象 ...
- 设计模式(九):Composite组合模式 -- 结构型模式
1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对 ...
- 设计模式C++学习笔记之十五(Composite组合模式)
15.1.解释 概念:将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合的使用具有一致性. main(),客户 CCorpNode,抽象基类,实现基本信 ...
- 设计模式(9)--Composite(组合模式)--结构型
1.模式定义: 组合模式属于对象的结构模式,有时又叫做“部分——整体”模式.组合模式将对象组织到树结构中,可以用来描述整体与部分的关系.组合模式可以使客户端将单纯元素与复合元素同等看待. 2.模式特点 ...
随机推荐
- jQuery API中文文档
jQuery API中文文档 http://www.css88.com/jqapi-1.9/category/events/event-handler-attachment/ jQuery UI AP ...
- TatukGIS-TGIS_Editor.CreateShape
procedure CreateShape(const _layer: TObject; const _ptg: TGIS_Point3D; const _type: TGIS_ShapeType; ...
- javascript定义类的方法总结
1.构造函数法 类是对象的模板,定义了对象共有的方法属性数据 等,在javascript中一个函数就是一个对象,也可以看做一个类的构造方法. 所以我们可以像以下方式定义类: //1.经典的构造方法 Q ...
- Delphi 指针大全(光看不练是学不会的)
大家都认为,C语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上.因此,说指针是C语言的灵魂,一点都不为过.同时,这种说法也让很多人产生误解,似乎只有C语言的指针才能算指针.Basic不支 ...
- 【VS调试】C#读写Windows 7注册表时抛出“不允许所请求的注册表访问权”的解决办法
原文:[VS调试]C#读写Windows 7注册表时抛出"不允许所请求的注册表访问权"的解决办法 项目 - 属性 - 安全性,"使用ClickOnce",修改a ...
- org.springframework.web.context.ContextLoaderListener
ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息.因为它实现了ServletContextListener这个接口,在web ...
- Android Wear计时器开发
记得在2013年12月的时候,有系列文章是介绍怎么开发一个智能手表的App,让用户可以在足球比赛中记录停表时间.随着Android Wear的问世,在可穿戴设备中开发一款这样的App确实是个很不错的想 ...
- BZOJ 1054 [HAOI2008]移动玩具
1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1388 Solved: 764[Submit][Statu ...
- Linux Shell编程(6)——变量替换
变量的名字是它的值保存的地方.引用它的值称为变量替换.$让我们仔细地区别变量和变量的值.如果variable1是一个变量的名字,那么$variable1就是引用这个变量的值――即这个变量它包含的数据. ...
- 【模拟】Codeforces 705B Spider Man
题目链接: http://codeforces.com/problemset/problem/705/B 题目大意: 两个人玩游戏,总共N个数,分别求前I(I=1 2 3...n)个数时游戏的获胜者是 ...