1、基本概念
组合模式( Composite Pattern )也称为整体部分( Part-Whole )模式,它的宗旨是通过将单个
对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的
使用具有一致性,属于结构型模式。
组合模式是一种树结构,那么就知道生活中得案例了,比如 目录-文件,学校-年级-班级,公司-部门
组合模式分为透明模式和安全模式
2、类图和角色
2.1、透明模式
2.2、安全模式
两者的区别在于抽象组件Component只定义了一个必须实现的方法,这样叶子节点Leaf,就不会去调用无关的方法,比如addChild方法
角色·:
抽象根节点:Component
分支节点:Composite
叶子结点:Leaf
3、案例
案例:一个公司有两个部门行政部和开发部
行政部
后勤部
人力部
开发部
java开发
python开发
c开发
抽象根节点:
public interface ICompany { void printDeptName(); }
树枝节点:
public class Composite implements ICompany{ private List<ICompany> list = new ArrayList<>(); private String name; private Integer level; public Composite(String name, Integer level) { list.add(new Dept(name)); this.name = name; this.level = level; } public void addDept(ICompany icompany){ list.add(icompany); } public void addAllDept(List<Dept> deptList){ for (Dept dept : deptList) { list.add(dept); } } @Override public void printDeptName() { for (int i = 0; i <list.size() ; i++) { if( i == 0){ System.out.println(""); }else{ System.out.print("---"); } list.get(i).printDeptName(); } } }
叶子结点
public class Dept implements ICompany{ private String name; public Dept(String name){ this.name = name; } public String getName() { return name; } @Override public void printDeptName() { System.out.println(name); } }
测试:
public class Test { public static void main(String[] args) { Dept dept1 = new Dept("行政部"); Dept dept2 = new Dept("人力部"); Dept dept3 = new Dept("后勤部"); Dept dept4 = new Dept("开发部"); Dept dept5 = new Dept("java开发部"); Dept dept6 = new Dept("python开发部"); Dept dept7 = new Dept("c开发部"); Composite composite = new Composite(dept1.getName(),2); composite.addDept(dept2); composite.addDept(dept3); composite.printDeptName(); System.out.println("_____________________________________"); Composite composite2 = new Composite(dept4.getName(),2); List<Dept> deptList = new ArrayList<>(); deptList.add(dept5); deptList.add(dept6); deptList.add(dept7); composite2.addAllDept(deptList); composite2.printDeptName(); } }
输出:
行政部 ---人力部 ---后勤部 _____________________________________ 开发部 ---java开发部 ---python开发部 ---c开发部
4、优缺点
优点:
1、可以清晰的分层
2、符合开闭原则
3、简化客户端代码