📅  最后修改于: 2023-12-03 15:12:08.642000             🧑  作者: Mango
复合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表现“整体/部分”层次结构。复合能让客户端以一致的方式处理个别对象以及对象组合。
Component:定义组合中对象的接口,声明了类共有接口的默认行为,可以有一个对父组件的操作。
Leaf:在组合中表示叶子结点对象,叶子结点没有子结点。
Composite:定义有子结点的那些组件的行为,存储子组件,在 Component 接口中实现与子组件有关的操作。
public interface Component {
void operation();
void add(Component component);
void remove(Component component);
Component getChild(int index);
}
public class Leaf implements Component {
@Override
public void operation() {
// do something
}
@Override
public void add(Component component) {
throw new UnsupportedOperationException();
}
@Override
public void remove(Component component) {
throw new UnsupportedOperationException();
}
@Override
public Component getChild(int index) {
throw new UnsupportedOperationException();
}
}
public class Composite implements Component {
private List<Component> children = new ArrayList<>();
@Override
public void operation() {
for (Component component : children) {
component.operation();
}
}
@Override
public void add(Component component) {
children.add(component);
}
@Override
public void remove(Component component) {
children.remove(component);
}
@Override
public Component getChild(int index) {
return children.get(index);
}
}
当你发现需求中是体现部分与整体层次结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时就可以使用复合模式。
复合模式在 GUI 中尤为常见,例如,一个 GUI 界面中常常包含了嵌套的面板和控件。像这样的界面,当用户进行操作(如点击一个按钮)时,其实是将整个 GUI 界面作为一个整体来处理的。
客户端可以一致地对待单个对象和组合对象,无需关心对象的具体类别。
增加新的组件类很容易,符合开放封闭原则。
通过递归实现对组合对象的操作,客户端可以不断地递归下去,而不用关心组合对象的具体实现。
复合模式可能会使设计过度一般化。
在使用复合模式时,对叶子节点和容器节点的处理方法有所不同,增加了代码实现的理解难度和代码复杂度。
复合模式是一种将对象组合成树形结构来表示 “整体 / 部分” 层次结构的模式。这种模式创建了一个包含了自己对象组的类。该类提供了修改相同对象组的方式。这种类型的设计模式属于结构型模式,它通过一种类似于树的结构实现了对对象的组合。
《Head First 设计模式》