适用场景
组合模式适用于树形结构。试想一个公司的所有员工,肯定有上下级关系,除了最底层的员工,其他员工都有自己的领导和自己管理的员工。Composite Pattern通过让每个非最底层员工持有自己的直接下属,从而实现这种树形结构。
因为公司的每个员工都具有一些共性,所以为他们设计一个公共父类或者接口,譬如Component或者叫Employee。但是最低层员工和非最底层员工有一些区别,因为最底层员工不允许添加下属,所以再设两个子类。
类图
实例代码
Component
public interface Component {
void add(Component component);
void remove(Component component);
void action();
Component getChild(int index);
}
Composite:
import java.util.ArrayList;
import java.util.List;
public class Composite implements Component{
private String num;
List<Component> children;
public Composite(String num) {
this.num=num;
this.children=new ArrayList<>();
}
@Override
public void add(Component component) {
if(!children.contains(component))
children.add(component);
}
@Override
public void remove(Component component) {
if(children.contains(component))
children.remove(component);
}
@Override
public void action() {
for(Component component:children)
component.action();
System.out.print(this.num+"\t");
}
@Override
public Component getChild(int index) {
return children.get(index);
}
}
LeafEmployee:
public class LeafEmployee implements Component{
private String name;
public LeafEmployee(String name) {
this.name=name;
}
@Override
public void add(Component component) {
return;
}
@Override
public void remove(Component component) {
return;
}
@Override
public void action() {
System.out.print(this.name+"\t");
}
@Override
public Component getChild(int index) {
return null;
}
}
Client:
public class Client {
public static void main(String[] args){
Component manager=new Composite("总经理");
Component vice_manager=new Composite("副经理");
Component leaf1=new LeafEmployee("小张");
Component leaf2=new LeafEmployee("小王");
manager.add(vice_manager);
vice_manager.add(leaf1);
vice_manager.add(leaf2);
manager.action();
}
}