组合模式 (composite)
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
在GoF23种设计模式中,属于结构型模式( Structural patterns)
。
以公司组织架构为例。一个公司通常是由许多部门组成的,每个部门下有可能有许多小部门以及每个小部门的主管。
这里部门主管可以看做员工的一种。员工与部门可以看做“部分-整体”的关系。最后员工与部门共同组成了公司的全部员工。
这里将主管和部门组合统一表示为公司员工,可以方便组织架构的统一调度和管理。
- 优点
- 方便调用,使用者不用关心是组合结构或是单个对象
- 方便对整体的控制,自由增加节点
- 缺点
- 违反了依赖倒置原则,需要区分组合对象与单体对象时要做特殊判断
- 使用场景
- 需要抽象树形结构关系时,考虑组合模式
实现
角色说明
- Component
- 组合中的对象声明接口
- 统一的行为表示体
- Composite
- 组合结构体
- Leaf
- 叶子节点对象
- 元对象
- Client
- 使用者
举例
- Organization.java
public class Organization {
public void print(){
throw new UnsupportedOperationException();
}
public void add(Organization organization){
throw new UnsupportedOperationException();
}
public void remove(Organization organization){
throw new UnsupportedOperationException();
}
public Organization getChild(Integer index){
throw new UnsupportedOperationException();
}
}
- Staff.java
public class Staff extends Organization{
private String name;
public Staff(String name) {
this.name = name;
}
@Override
public void print() {
System.out.println(name);
}
}
- Department.java
public class Department extends Organization {
private List<Organization> organizationList = new ArrayList<>();
private String name;
private Integer level;
public Department(String name, Integer level) {
this.name = name;
this.level = level;
}
@Override
public void print() {
System.out.println(this.name);
for (Organization organization : organizationList) {
for (int i = 0; i < level; i++) {
System.out.print(" ");
}
organization.print();
}
}
@Override
public void add(Organization organization) {
organizationList.add(organization);
}
@Override
public void remove(Organization organization) {
organizationList.remove(organization);
}
@Override
public Organization getChild(Integer index) {
if (index > organizationList.size()) {
return null;
}
return organizationList.get(index);
}
}
- Client.java
public class Client {
public static void main(String[] args) {
//组建公司
Department company = new Department("ordin company",1);
Department hr = new Department("hr",2);
Department dev = new Department("dev",2);
Department it = new Department("it",3);
Staff ceo = new Staff("ordin(主管-CEO)");
Staff cto = new Staff("ordinT(主管-CTO)");
Staff it1 = new Staff("开发-it1");
Staff it2 = new Staff("开发-it2");
//一级部门
company.add(ceo);
company.add(dev);
company.add(hr);
//二级部门
dev.add(cto);
dev.add(it);
it.add(it1);
it.add(it2);
company.print();
System.out.println("\n互联网寒冬来了 呼呼呼~");
System.out.println("开始裁员 .......\n");
//裁员 开发-it2
company.getChild(1).getChild(1).remove(it2);
company.print();
}
}
- output
ordin company
ordin(主管-CEO)
dev
ordinT(主管-CTO)
it
开发-it1
开发-it2
hr
互联网寒冬来了 呼呼呼~
开始裁员 .......
ordin company
ordin(主管-CEO)
dev
ordinT(主管-CTO)
it
开发-it1
hr
实例
code: org.apache.ibatis.scripting.xmltags.SqlNode#apply
总结
组合模式就是把多个对象组合成一个对象,减少对多个对象的访问。方便系统管理和使用。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为:
2019-12-12