组合模式

组合模式

组合模式(Composite Pattern)有时候又叫做部分-整体模式,允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

根据《设计模式》定义:将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。

组合模式主要涉及到几个对象:

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

UML图

树形结构:

组合模式比较复杂,一般有以下用途:

      1.你想表示对象的部分-整体层次结构   2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

要点

  1. 组合模式提供一个结构,可同时包含个别对象和组合对象。
  2. 组合模式允许客户对个别对象以及组合对象一视同仁。
  3. 组合结构内的任意对象成为组件,组件可以是组合,也可以是叶节点。
  4. 实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。

例子:

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);  
}  
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) {  
        // TODO Auto-generated method stub  
        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);  
    }  
} 
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) {  
          
    }  
      
}  
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) {  
          
    }  
      
}  
public class Client {  
  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        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);  
        Company huadongCom = new ConcreteCompany("上海华东分公司");  
        huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));  
        huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));  
        Company hangzhouCom = new ConcreteCompany("杭州办事处");  
        hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));  
        hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));  
        Company nanjingCom = new ConcreteCompany("南京办事处");  
        nanjingCom.add(new FinanceDepartment("南京办事处财务部"));  
        nanjingCom.add(new HRDepartment("南京办事处人力资源部"));  
        huadongCom.add(hangzhouCom);  
        huadongCom.add(nanjingCom);   
        root.add(shandongCom);  
        root.add(huadongCom);  
        root.display(0);  
    }  
  
}  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

silverlight + wcf(json格式) + sqlserver存储过程分页

silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1...

26870
来自专栏菩提树下的杨过

结构struct(值类型)在实际应用要注意的二点:

.Net中的数据类型大致可以分为二类:一类是值类型,一类是引用类型;结构(struct)是值类型,从性能上考虑值类型更有优势(关于值类型与引用类型的详细讨论不在...

23460
来自专栏菩提树下的杨过

字符编码-使用c#研究

微软的那个臭屁的JOEL(就是写《JOEL说软件》的那个牛人)曾说:“每一位软件开发人员必须、绝对要至少具备UNICODE与字符集知识(没有任何例外)”,我也常...

22570
来自专栏企鹅号快讯

2017全球存储大会:存储设备面临三大挑战

据飞象网,12月25日消息,在近日的“2017全球存储大会”上,中国信息通信研究院副院长王志勤表示,互联网+、大数据等战略规划,给存储行业的发展带来了良好的机遇...

248100
来自专栏菩提树下的杨过

WPF中的MatrixTransform

WPF中的MatrixTransform            周银辉 虽然在WPF中可以使用TranslateTransform、RotateTrans...

229100
来自专栏存储

痛并快乐着:浅谈大数据时代的分布式存储架构

从全球知名咨询公司麦肯锡宣称“大数据”时代的到来,时至今日,数据量已经几何倍数的翻增,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因...

35770
来自专栏存储

手把手教你,人人都能学会数据恢复

U盘或硬盘中的文件不小心被删除了,这时候不要慌张,停止一切操作(关闭运行的所有程序,停止复制粘贴),更不要急着上网找一些恢复软件,因为,你在下载软件并安装的同时...

28260
来自专栏菩提树下的杨过

C#检测SqlServer中某张表是否存在

-- ============================================= -- Author: <杨俊明(菩提下的杨过 http://...

239100
来自专栏存储

建立本地的Blast数据库

Blast(basic local alignment search tool) 局部序列比对基本检索工具,是NCBI开发的一款基于序列相似性的数据库搜索程序。...

72790
来自专栏企鹅号快讯

区块链技术的历史发展的不同阶段

1982年 拜占庭将军问题 Leslie Lamport等人提出拜占庭将军问题(Byzantine Generals Problem),把军中各地军队彼此取...

29550

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励