携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
1.组合模式(Composite)概念:
组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
2.意图:
- 将对象组合成属性结构以表示“部分-整体”的层次结构。
- Composite模式使得用户对单个对象和组合对象的使用具有一致性。
3.组合模式构成:
- Component(抽象构件接口):
- 为组合的对象声明接口
- 在某些情况下实现从此接口派生出的所有类共有的默认行为
- 定义一个接口可以访问几管理它的多个子部件
- Leaf(叶部件):
- 在组合中表示叶节点对象,叶节点没有子节点
- 定义组合中接口对象的行为
- Composite(组合类):
- 定义有子节点(子部件)的部件的行为
- 存储子节点(子部件)
- 在Component接口中实现与子部件相关的操作
- Client(客户端):
- 通过Component接口控制组合部件的对象
4.组合模式UML类图:
5.组合模式UML序列图:
6.组合模式的分类:
- 安全式:添加Component对象的操作定义在Composite角色中,这样的话Leaf角色就无需实现这些方法(因为Leaf角色本身不需要实现这些方法)。
- 透明式:添加Component对象的操作定义在Component角色中,这样的话Composite角色需要实现这些方法,Leaf也需要实现这些方法,而这些方法对于Leaf来说没有任何意义,不过这样做将系统实现统一起来,因此对客户端是透明的(客户端无需区分Composite还是Leaf),因为这些角色中都具备了这些方法。
7.代码示例:
安全式:
public interface Component {
void doSomething();
}
public class Leaf implements Component {
@Override
public void doSomething() {
System.out.println("执行方法");
}
}
public class Composite implements Component {
private List<Component> list = new ArrayList<>();
public void add(Component component) {
list.add(component);
}
public void remove(Component component) {
list.remove(component);
}
public List<Component> getAll() {
return list;
}
@Override
public void doSomething() {
for (Component component : list) {
component.doSomething();
}
}
}
public class Client {
public static void main(String[] args) {
Component comp = new Leaf();
Component comp2 = new Leaf();
Composite composite = new Composite();
composite.add(comp);
composite.add(comp2);
composite.doSomething();
}
}
透明式:
```java
public interface Component {
void doSomething();
void add(Component component);
void remove(Component component);
List<Component> getAll();
}
public class Leaf implements Component {
@Override
public void doSomething() {
System.out.println("执行方法");
}
@Override
public void add(Component component) {
}
@Override
public void remove(Component component) {
}
@Override
public List<Component> getAll() {
return null;
}
}
public class Composite implements Component {
private List<Component> list = new ArrayList<>();
public void add(Component component) {
list.add(component);
}
public void remove(Component component) {
list.remove(component);
}
public List<Component> getAll() {
return list;
}
@Override
public void doSomething() {
for (Component component : list) {
component.doSomething();
}
}
}
public class Client {
public static void main(String[] args) {
Component comp = new Leaf();
Component comp2 = new Leaf();
Component composite = new Composite();
composite.add(comp);
composite.add(comp2);
composite.doSomething();
}
}