GoF:它的意图是将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。

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

package design.composite;

public abstract class Company {
private String name;
public Company(String name) {
this.name = name;
}
public Company() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected abstract void add(Company company);
protected abstract void romove(Company company);
protected abstract void display(int depth);
}
package design.composite;
import java.util.ArrayList;
import java.util.List;

public class ConcreteCompany extends Company {
private List<Company> cList;
public ConcreteCompany() {
cList = new ArrayList<Company>();
}
public ConcreteCompany(String name) {
super(name);
cList = new ArrayList<Company>() ;
}
@Override
protected void add(Company company) {
cList.add(company);
}
@Override
protected void display(int depth) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName());
for (Company c : cList) {
c.display(depth + 2);
}
}
@Override
protected void romove(Company company) {
cList.remove(company);
}
}
package design.composite;
public class FinanceDepartment extends Company {
public FinanceDepartment(){
}
public FinanceDepartment(String name){
super(name);
}
@Override
protected void add(Company company) {
}
@Override
protected void display(int depth) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName() ) ;
}
@Override
protected void romove(Company company) {
}
}
package design.composite;
public class HRDepartment extends Company {
public HRDepartment(){
}
public HRDepartment(String name){
super(name);
}
@Override
protected void add(Company company) {
}
@Override
protected void display(int depth) {
StringBuilder sb = new StringBuilder("");
for (int i = 0; i < depth; i++) {
sb.append("-");
}
System.out.println(new String(sb) + this.getName() ) ;
}
@Override
protected void romove(Company company) {
}
}

package design.composite;
public class Client {
public static void main(String[] args) {
Company root = new ConcreteCompany();
root.setName("北京总公司");
root.add(new HRDepartment("总公司人力资源部"));
root.add(new FinanceDepartment("总公司财务部"));

Company shandongCom = new ConcreteCompany("山东分公司");
shandongCom.add(new HRDepartment("山东分公司人力资源部"));
shandongCom.add(new FinanceDepartment("山东分公司账务部"));

Company zaozhuangCom = new ConcreteCompany("枣庄办事处");
zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));
zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));
Company jinanCom = new ConcreteCompany("济南办事处");
jinanCom.add(new FinanceDepartment("济南办事处财务部"));
jinanCom.add(new HRDepartment("济南办事处人力资源部"));

shandongCom.add(jinanCom);
shandongCom.add(zaozhuangCom);

root.add(shandongCom);
root.display(0);
}
}

自:http://blog.csdn.net/hfmbook/article/details/7693069

设计模式之十二:组合模式(composite)相关推荐

  1. 设计模式学习笔记(六) - 组合模式 Composite (树状结构专用模式)

    组合模式 Composite 树状结构专用模式   递归遍历结构

  2. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来 ...

  3. 设计模式(八)组合模式 Composite

    组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 组合模式适用于创建复杂的对象,这个对象包含某些个别的对象以及 ...

  4. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  5. Java设计模式(十二) 策略模式

    策略模式介绍 策略模式定义 策略模式(Strategy Pattern),将各种算法封装到具体的类中,作为一个抽象策略类的子类,使得它们可以互换.客户端可以自行决定使用哪种算法. 策略模式类图 策略模 ...

  6. 云计算设计模式(十二)——索引表模式

    云计算设计模式(十二)--索引表模式 创建索引过的被查询条件经常被引用的数据存储等领域.这种模式可以通过允许应用程序更快速地定位数据来从数据存储中检索提高查询性能. 背景和问题 许多数据存储通过使用主 ...

  7. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  8. 【设计模式】组合模式 Composite Pattern

    树形结构是软件行业很常见的一种结构,几乎随处可见,  比如: HTML 页面中的DOM,产品的分类,通常一些应用或网站的菜单,Windows Form 中的控件继承关系,Android中的View继承 ...

  9. 二十三种设计模式(第十二种)-----代理模式(Proxy)

    二十三种设计模式(第十二种)-----代理模式(Proxy) 尚硅谷视频连接https://www.bilibili.com/video/BV1G4411c7N4?from=search&se ...

  10. 设计模式(十二)—— 享元模式

    设计模式(十二)-- 享元模式 定义 结构 案例实现 优缺点和使用场景 JDK源码解析 定义 运用共享技术来有效地支持大量细粒度对象的复用.它通过共享已经存在的对象来大幅度减少需要创建的对象数量.避免 ...

最新文章

  1. Node.js开发WEB项目后端接口API,基于mysql5.7数据库(小试牛刀)
  2. Java 程序员薪资这么高,取决于什么?
  3. android Camera2
  4. 华农计算机科学宿舍在哪个区,新生指南Ⅵ | 住在华农·看看我们第二个家
  5. Flex 与 JavaScript 交互
  6. 使用Apache CXF开发RESTful服务
  7. Vue 生命周期LIFECYCLE是8个吗?
  8. lombok依赖_使用Lombok 前你需要知道这些
  9. 使用容器服务支持开发者快速搭建小程序后端服务
  10. 【LeetCode】【数组】题号:*498,对角线遍历
  11. Python编程:数据可视化《Python编程:从入门到实践 第2版》笔记
  12. php读取剪贴板内容,jQuery获取剪贴板内容的方法
  13. 【Alpha版本】冲刺阶段——Day 1
  14. php形状特征提取方法,LowB沙箱-PHP动态特征提取
  15. 微信商户号企业付款到零钱开通地址
  16. 云视频会议已成未来发展必然趋势
  17. vi 撤销上一步操作
  18. 最新v6.0 tgroupon分销系统源码+TGROUPON卖货系统 ECSHOP+ECTOUCH内核
  19. 遇见王沥川的人生感悟_遇见王沥川的人生感悟
  20. FPGA经验谈系列文章——前言和目录

热门文章

  1. php header是什么,学习猿地-php header什么意思
  2. 服务器连接池怎么配置文件,服务器连接池怎么配置
  3. multisim怎么设置晶体管rbe_怎么在multisim14里仿真电路
  4. 平衡二叉树删除_AVL 平衡树
  5. 占用率_有问有答:任务管理器里面的GPU占用率到底是怎么算的?
  6. python点操作符语法,Python 语法之操作符和表达式
  7. python实现api server,初学python,准备学习做个restful api server,现在有些困惑
  8. java 实现复制_在java中如何实现复制,粘贴,剪切
  9. java程序员期望薪资_11月程序员平均薪资达14327元,薪资最高的居然不是JAVA?
  10. linux中nfs存储权限,NFS权限管理 - 麦苗的个人空间 - OSCHINA - 中文开源技术交流社区...