设计模式--7、组合模式

【转载】组合模式


    组合模式(Composite Pattern)有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念
  ,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。组合模式让你可以优化处理递
  归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每
  次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。
  按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
  定义(GoF《设计模式》):将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和使用具有一致性。
  涉及角色:
  1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component
子部件。
  2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。
  3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除
(remove)等。
  
  适用性
  以下情况下适用Composite模式:
  1.你想表示对象的部分-整体层次结构
  2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
  总结
组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件
系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相

同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。

如图:

举例如下:

    1. package design.composite;  
    2. /** 
    3.  * 文件名称:design.composite.Company.java 
    4.  *  创建人:Fei Wong  
    5.  *  创建时间: 2012-06-26 
    6.  * 电子邮箱:feiwong8@126.com  
    7.  *  
    8.  */  
    9. public abstract class Company {  
    10.     private String name;  
    11.   
    12.     public Company(String name) {  
    13.         this.name = name;  
    14.     }  
    15.   
    16.     public Company() {  
    17.     }  
    18.   
    19.     public String getName() {  
    20.         return name;  
    21.     }  
    22.   
    23.     public void setName(String name) {  
    24.         this.name = name;  
    25.     }  
    26.   
    27.     protected abstract void add(Company company);  
    28.   
    29.     protected abstract void romove(Company company);  
    30.   
    31.     protected abstract void display(int depth);  
    32. }  
    33.   
    34.   
    35.   
    36.   
    37. package design.composite;  
    38.   
    39. import java.util.ArrayList;  
    40. import java.util.List;  
    41. /** 
    42.  * 文件名称:design.singleton.CommandInvoker.java 
    43.  *  创建人:Fei Wong  
    44.  *  创建时间: 2012-06-26 
    45.  * 电子邮箱:feiwong8@126.com  
    46.  *  
    47.  */  
    48. public class ConcreteCompany extends Company {  
    49.     private List<Company> cList;  
    50.   
    51.     public ConcreteCompany() {  
    52.         cList = new ArrayList<Company>();  
    53.     }  
    54.   
    55.     public ConcreteCompany(String name) {  
    56.         super(name);   
    57.         cList = new ArrayList<Company>() ;   
    58.     }  
    59.   
    60.     @Override  
    61.     protected void add(Company company) {  
    62.         cList.add(company);  
    63.     }  
    64.   
    65.     @Override  
    66.     protected void display(int depth) {  
    67.         // TODO Auto-generated method stub  
    68.         StringBuilder sb = new StringBuilder("");  
    69.         for (int i = 0; i < depth; i++) {  
    70.             sb.append("-");   
    71.         }  
    72.         System.out.println(new String(sb) + this.getName());  
    73.         for (Company c : cList) {  
    74.             c.display(depth + 2);  
    75.         }  
    76.     }  
    77.   
    78.     @Override  
    79.     protected void romove(Company company) {  
    80.         cList.remove(company);  
    81.     }  
    82. }  
    83.   
    84.   
    85.   
    86. package design.composite;  
    87. /** 
    88.  * 文件名称:design.composite.FinanceDepartment.java 
    89.  *  创建人:Fei Wong  
    90.  *  创建时间: 2012-06-26 
    91.  * 电子邮箱:feiwong8@126.com 
    92.  */  
    93. public class FinanceDepartment extends Company {  
    94.       
    95.       
    96.     public FinanceDepartment(){  
    97.           
    98.     }  
    99.       
    100.     public FinanceDepartment(String name){  
    101.         super(name);  
    102.     }  
    103.       
    104.     @Override  
    105.     protected void add(Company company) {  
    106.   
    107.     }  
    108.   
    109.     @Override  
    110.     protected void display(int depth) {  
    111.         StringBuilder sb = new StringBuilder("");  
    112.         for (int i = 0; i < depth; i++) {  
    113.             sb.append("-");  
    114.         }  
    115.         System.out.println(new String(sb) + this.getName() ) ;   
    116.     }  
    117.   
    118.     @Override  
    119.     protected void romove(Company company) {  
    120.           
    121.     }  
    122.       
    123. }  
    124.   
    125.   
    126.   
    127.   
    128. package design.composite;  
    129. /** 
    130.  * 文件名称:design.composite.HRDepartment.java 
    131.  *  创建人:Fei Wong  
    132.  *  创建时间: 2012-06-26 
    133.  * 电子邮箱:feiwong8@126.com 
    134.  */  
    135. public class HRDepartment extends Company {  
    136.       
    137.       
    138.     public HRDepartment(){  
    139.           
    140.     }  
    141.       
    142.     public HRDepartment(String name){  
    143.         super(name);  
    144.     }  
    145.       
    146.     @Override  
    147.     protected void add(Company company) {  
    148.   
    149.     }  
    150.   
    151.     @Override  
    152.     protected void display(int depth) {  
    153.         StringBuilder sb = new StringBuilder("");  
    154.         for (int i = 0; i < depth; i++) {  
    155.             sb.append("-");   
    156.         }  
    157.         System.out.println(new String(sb) + this.getName() ) ;   
    158.     }  
    159.   
    160.     @Override  
    161.     protected void romove(Company company) {  
    162.           
    163.     }  
    164.       
    165. }  
    166.   
    167.   
    168.   
    169.   
    170. package design.composite;  
    171.   
    172. public class Client {  
    173.   
    174.     /** 
    175.      * @param args 
    176.      */  
    177.     public static void main(String[] args) {  
    178.         // TODO Auto-generated method stub  
    179.         Company root = new ConcreteCompany();  
    180.         root.setName("北京总公司");  
    181.         root.add(new HRDepartment("总公司人力资源部"));  
    182.         root.add(new FinanceDepartment("总公司财务部"));  
    183.         Company shandongCom = new ConcreteCompany("山东分公司");  
    184.         shandongCom.add(new HRDepartment("山东分公司人力资源部"));  
    185.         shandongCom.add(new FinanceDepartment("山东分公司账务部"));  
    186.         Company zaozhuangCom = new ConcreteCompany("枣庄办事处");  
    187.         zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));  
    188.         zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));  
    189.         Company jinanCom = new ConcreteCompany("济南办事处");  
    190.         jinanCom.add(new FinanceDepartment("济南办事处财务部"));  
    191.         jinanCom.add(new HRDepartment("济南办事处人力资源部"));   
    192.         shandongCom.add(jinanCom);  
    193.         shandongCom.add(zaozhuangCom);  
    194.         Company huadongCom = new ConcreteCompany("上海华东分公司");  
    195.         huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));  
    196.         huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));  
    197.         Company hangzhouCom = new ConcreteCompany("杭州办事处");  
    198.         hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));  
    199.         hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));  
    200.         Company nanjingCom = new ConcreteCompany("南京办事处");  
    201.         nanjingCom.add(new FinanceDepartment("南京办事处财务部"));  
    202.         nanjingCom.add(new HRDepartment("南京办事处人力资源部"));  
    203.         huadongCom.add(hangzhouCom);  
    204.         huadongCom.add(nanjingCom);   
    205.         root.add(shandongCom);  
    206.         root.add(huadongCom);  
    207.         root.display(0);  
    208.     }  
    209.   
原文地址:https://www.cnblogs.com/snowbook/p/5150474.html