前言
- 掌握组合模式的应用场景
- 掌握组合模式的优缺点
一、定义
组合模式(Composite Pattern)也称为整体-部分模式(Part-Whole),它得宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同得接口进行表示,使得客户对单个对象和组合对象得使用具有一致性。
组合关系:具有相同的生命周期。
聚合关系:具有不同的生命周期
二、应用场景
- 希望客户端可以忽略组合对象与单个对象的差异时
- 对象层次具备整体和部分,呈树形结构
三、基本结构
- 抽象构件角色(Component): 为树叶构件和树枝构件声明公共接口,并实现它们默认行为。
- 树叶构件角色(Leaf):是组合中的叶子节点对象,它没有子节点,用于继承或实现抽象构件。
- 树枝构件角色(Composite):是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含Add,Remove,GetChild等方法。
- 客户端角色(Client):用来调用构件。
四、基本使用
1.抽象构件
public abstract class Component {
protected String name;
public Component(String name) {
this.name = name;
}
abstract void operate();
}
2. 树叶构件
public class Leaf extends Component {
public Leaf(String name) {
super(name);
}
@Override
public void operate() {
System.out.println("树叶" + name + "被访问");
}
}
3. 树枝构件
public class Composite extends Component {
private List<Component> children = new ArrayList<>();
public Composite(String name) {
super(name);
}
@Override
public void operate() {
System.out.println("树枝节点" + name);
for (Component component : children) {
component.operate();
}
}
public void add(Component component) {
children.add(component);
}
public void remove(Component component) {
children.remove(component);
}
public Component getChild(int i) {
return children.get(i);
}
}
4. 客户端
public class Client {
public static void main(String[] args) {
Composite root = new Composite("1");
Composite composite = new Composite("2");
root.add(new Leaf("1"));
composite.add(new Leaf("2"));
composite.add(new Leaf("3"));
root.add(composite);
root.operate();
}
}
F:\BaiduNetdiskDownload\VIP专享–2020期录播视频及资料\2020期课程资料\01.架构师内功心法\02.经典框架中常见的设计模式\6.享元模式与组合模式详解\课堂笔记
总结
1. 优点
- 组合模式使得客户端代码可以一致的处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,简化了客户端代码。
- 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足”开闭原则“。
2. 缺点
- 设计较复杂,客户端需要花更多时间清理类之间的层次关系。
- 不容易限制容器中的构件。
- 不容易用继承的方法来增加构件的新功能。