组合模式
将对象组合成树形结构表示”部分-整体“的层次结构,使得用户对单个对象和组合对象的使用具有一致性
树形目录结构
核心概念
- Component 抽象的组件对象
- Leaf 叶子节点对象
- Composite 组合对象,存储子组件,定义有子组件的行为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
public abstract class Component {
public abstract void doSomething();
public void addChild(Component child){ throw new UnsupportedOperationException(); }
public void removeChild(Component child){ throw new UnsupportedOperationException(); }
public Component getChild(int index){ throw new UnsupportedOperationException(); } }
public class Composite extends Component { private List<Component> childs = new ArrayList<>(); @Override public void doSomething() { for(Component component : childs){ component.doSomething(); } }
@Override public void addChild(Component child) { childs.add(child); }
@Override public void removeChild(Component child) { if(childs.size() > 0){ childs.remove(child); } }
@Override public Component getChild(int index) { if(childs.size() > 0 && index <= childs.size()){ return childs.get(index); } return null; } }
public class Leaf extends Component{
private String name;
public Leaf(String name){ this.name = name; }
@Override public void doSomething() { System.out.println("My name is "+ name); } }
|
优缺点
优点
- 定义了包含基本对象和组合对象的类层次结构
- 统一了组合对象和叶子对象
- 简化了客户端的调用
缺点
使用场景
- 想表示对象的部分-整体层次结构,把整体和部分的操作统一起来,使得层次结构更简单
- 希望统一地使用组合结构中的所有对象
- 为单个对象与复合对象提供统一的接口