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.模式特点 ...
随机推荐
- xcode 工具 alcatraz---备用
简介 Alcatraz 是一个帮你管理 Xcode 插件.模版以及颜色配置的工具.它可以直接集成到 Xcode 的图形界面中,让你感觉就像在使用 Xcode 自带的功能一样. 安装和删除 使用如下的命 ...
- BZOJ 1263 整数划分
Description 从文件中读入一个正整数\(n\).要求将\(n\)写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,\(n=13\),则当\(n\)表示为\(4+3+3+3\)(或\( ...
- codeforces Upgrading Array
思路:对于每个数分解质因子然后记录每一个质因子的个数,对与在b中出现的质因子就减去1,否则加1,求出总的,然后从后面一次对它们的最大公约数,然后判断除以最大公约数之后,改变量是不是变化,求最大值,变化 ...
- WordPress 3.5.1 crypt_private()远程拒绝服务漏洞(CVE-2013-2173)
漏洞版本: WordPress 3.5.1 漏洞描述: BUGTRAQ ID: 60477 CVE(CAN) ID: CVE-2013-2173 WordPress是一种使用PHP语言和MySQL数据 ...
- 【转】寻找最好的笔记软件:三强篇(EverNote、Mybase、Surfulater) (v1.0) (
原文网址:http://blog.sina.com.cn/s/blog_46dac66f01000b57.html 寻找最好的笔记软件:三强篇(EverNote.Mybase.Surfulater) ...
- (转载)PCNTL函数族--PHP多进程编程
(转载)http://www.cnblogs.com/zox2011/archive/2013/02/19/2917448.html php有一组进程控制函数,使得php能在*nix系统中实现跟c一样 ...
- 【单调栈】Vijos P1926 紫色的手链
题目链接: https://vijos.org/p/1926 题目大意: 给n个数(n<=100 000),求任意区间的最大值异或次大值的最大值. 题目思路: [模拟][单调栈] 我们维护一个严 ...
- 编写一个单独的Web Service for Delphi7(步骤)
1新建一个SOAP Server Application,在提示输入接口时输入MyHello,把所有文件保存在一个叫Ser的目录下,其中一个包含TWebModule1的文件保存为main.pas.在M ...
- QTP自传之对象库编程
对象库编程是我们平时工作中使用最多的编程方式,在自动化脚本开发中起到举足轻重的作用,与描述性性编程相比,更直接和易于维护,今天就和大家简单的聊聊如何进行对象库编程. 既然是对象库编程,肯定要对已存在于 ...
- 将对象格式的style转换为字符串格式
var style = { position:'absolute', background:'red', width:'2px', height:'2px', color:'#fff', top:x, ...