组合模式

 
组合模式(Composite Pattern)
 
  • 何时使用将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
  • 如何解决树枝和叶子实现统一接口,接口内部含有叶子属性和 List属性List中组合该接口自身
  • 优点: 1、高层模块调用简单。 2、节点自由增加。
  • 使用场景:部分、整体场景,如:1、树形菜单,文件、文件夹的管理。2、Android中类View可以做为ViewGroup的一部分。组合模式使得用户对单个对象View和组合对象ViewGroup的使用具有一致性。
 
例子:
Employee(单个叶子)中含有单个Employee的自身属性一个List<Employee> subordinates(树枝/集合),单个对象Employee和组合对象List<Employee> subordinates的使用具有统一管理接口Employee
  1. publicclassCompositePatternDemo{
  2.    publicstaticvoid main(String[] args){
  3.       Employee CEO =newEmployee("John","CEO",30000);
  4.  
  5.       Employee headSales =newEmployee("Robert","Head Sales",20000);
  6.  
  7.       Employee headMarketing =newEmployee("Michel","Head Marketing",20000);
  8.  
  9.       Employee clerk1 =newEmployee("Laura","Marketing",10000);
  10.       Employee clerk2 =newEmployee("Bob","Marketing",10000);
  11.  
  12.       Employee salesExecutive1 =newEmployee("Richard","Sales",10000);
  13.       Employee salesExecutive2 =newEmployee("Rob","Sales",10000);
  14.  
  15.       CEO.add(headSales);
  16.       CEO.add(headMarketing);
  17.  
  18.       headSales.add(salesExecutive1);
  19.       headSales.add(salesExecutive2);
  20.  
  21.       headMarketing.add(clerk1);
  22.       headMarketing.add(clerk2);
  23.  
  24.       //打印该组织的所有员工
  25.       System.out.println(CEO);
  26.       for(Employee headEmployee : CEO.getSubordinates()){
  27.          System.out.println(headEmployee);
  28.          for(Employee employee : headEmployee.getSubordinates()){
  29.             System.out.println(employee);
  30.          }
  31.       }       
  32.    }
  33. }
 
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. publicclassEmployee{
  5.    privateString name;
  6.    privateString dept;
  7.    privateint salary;
  8.    privateList<Employee> subordinates;
  9.  
  10.    //构造函数
  11.    publicEmployee(String name,String dept,int sal){
  12.       this.name = name;
  13.       this.dept = dept;
  14.       this.salary = sal;
  15.       subordinates =newArrayList<Employee>();
  16.    }
  17.  
  18.    publicvoid add(Employee e){
  19.       subordinates.add(e);
  20.    }
  21.  
  22.    publicvoid remove(Employee e){
  23.       subordinates.remove(e);
  24.    }
  25.  
  26.    publicList<Employee> getSubordinates(){
  27.      return subordinates;
  28.    }
  29.  
  30.    publicString toString(){
  31.       return("Employee :[ Name : "+ name
  32.       +", dept : "+ dept +", salary :"
  33.       + salary+" ]");
  34.    }  
  35. }
 
 
 
 



原文地址:https://www.cnblogs.com/Doing-what-I-love/p/5621182.html