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、简化客户端代码
来源:oschina
链接:https://my.oschina.net/u/4351890/blog/4429130