文章目录
1. 组合模式
1.1 介绍
组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。
将对象组成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
1.2 优缺点
优点
- 高层模块调用简单。
- 节点自由增加。
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
1.3 使用场景
它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
1.4 注意事项
2. 案例代码
现在我有了好看的娃娃挂在车里,但是我觉得还是不够,我又去买了一个俄罗斯套娃,套娃套娃套娃~,瞬间我的奥迪车B格就上来了。
public class Matryoshka {
// 俄罗斯套娃 Matryoshka
private String name;
private Matryoshka matryoshka;
public Matryoshka(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Matryoshka getMatryoshka() {
return matryoshka;
}
public void setMatryoshka(Matryoshka matryoshka) {
this.matryoshka = matryoshka;
}
}
public class Car {
private Matryoshka matryoshka;
public Matryoshka getMatryoshka() {
return matryoshka;
}
public void setMatryoshka(Matryoshka matryoshka) {
this.matryoshka = matryoshka;
}
}
/** * 组合模式 * *@Author cly *@Date 2021/08/31 16:17 *@Version 1.0 */
public class Combination {
public static void main(String[] args) {
Car car = new Car();
car.setMatryoshka(new Matryoshka("套娃1"));
car.getMatryoshka().setMatryoshka(new Matryoshka("套娃2"));
car.getMatryoshka().getMatryoshka().setMatryoshka(new Matryoshka("套娃3"));
System.out.println(car.getMatryoshka().getName());
System.out.println(car.getMatryoshka().getMatryoshka().getName());
System.out.println(car.getMatryoshka().getMatryoshka().getMatryoshka().getName());
}
}
3. 源码实现
3.1 java.awt.container
JDK 的 AWT(Abstract Window Toolkit),使用了组合模式。AWT 中包含了两种组件:容器组件和基本组件。
- 容器组件是 java.awt.Container 的子孙类
- 基本组件是 java.awt.Component 的子孙类
- 容器组件和基本组件都是 java.awt.Component 的子孙类
Container 类中包含了很多基本组件或容器,放在 ArrayList 中
public class Container extends Component {
private java.util.List<Component> component = new ArrayList<>();
//向容器类中添加基本组件或容器
public Component add(Component comp) {
addImpl(comp, null, -1);
return comp;
}
}
基本组件与容器组件,构成了树状结构。由于都是 Component 的子孙类,对 Component 定义的方法,访问上具有一致性。
3.2 java.util.HashMap
在HashMap中也会用到组合模式,比如下方的K可能就是HashMap类型的。
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
除此之外,容器类基本能实现组合模式。