组合模式
组合模式(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

publicclassCompositePatternDemo{publicstaticvoid main(String[] args){Employee CEO =newEmployee("John","CEO",30000);Employee headSales =newEmployee("Robert","Head Sales",20000);Employee headMarketing =newEmployee("Michel","Head Marketing",20000);Employee clerk1 =newEmployee("Laura","Marketing",10000);Employee clerk2 =newEmployee("Bob","Marketing",10000);Employee salesExecutive1 =newEmployee("Richard","Sales",10000);Employee salesExecutive2 =newEmployee("Rob","Sales",10000);CEO.add(headSales);CEO.add(headMarketing);headSales.add(salesExecutive1);headSales.add(salesExecutive2);headMarketing.add(clerk1);headMarketing.add(clerk2);//打印该组织的所有员工System.out.println(CEO);for(Employee headEmployee : CEO.getSubordinates()){System.out.println(headEmployee);for(Employee employee : headEmployee.getSubordinates()){System.out.println(employee);}}}}
import java.util.ArrayList;import java.util.List;publicclassEmployee{privateString name;privateString dept;privateint salary;privateList<Employee> subordinates;//构造函数publicEmployee(String name,String dept,int sal){this.name = name;this.dept = dept;this.salary = sal;subordinates =newArrayList<Employee>();}publicvoid add(Employee e){subordinates.add(e);}publicvoid remove(Employee e){subordinates.remove(e);}publicList<Employee> getSubordinates(){return subordinates;}publicString toString(){return("Employee :[ Name : "+ name+", dept : "+ dept +", salary :"+ salary+" ]");}}

浙公网安备 33010602011771号