[23种设计模式][结构型]20.组合模式

119 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

1.组合模式(Composite)概念:

组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

2.意图:

  • 将对象组合成属性结构以表示“部分-整体”的层次结构。
  • Composite模式使得用户对单个对象和组合对象的使用具有一致性。

3.组合模式构成:

  • Component(抽象构件接口):
    • 为组合的对象声明接口
    • 在某些情况下实现从此接口派生出的所有类共有的默认行为
    • 定义一个接口可以访问几管理它的多个子部件
  • Leaf(叶部件):
    • 在组合中表示叶节点对象,叶节点没有子节点
    • 定义组合中接口对象的行为
  • Composite(组合类):
    • 定义有子节点(子部件)的部件的行为
    • 存储子节点(子部件)
    • 在Component接口中实现与子部件相关的操作
  • Client(客户端):
    • 通过Component接口控制组合部件的对象

4.组合模式UML类图:

Image.png

5.组合模式UML序列图:

Image.png

6.组合模式的分类:

  1. 安全式:添加Component对象的操作定义在Composite角色中,这样的话Leaf角色就无需实现这些方法(因为Leaf角色本身不需要实现这些方法)。
  2. 透明式:添加Component对象的操作定义在Component角色中,这样的话Composite角色需要实现这些方法,Leaf也需要实现这些方法,而这些方法对于Leaf来说没有任何意义,不过这样做将系统实现统一起来,因此对客户端是透明的(客户端无需区分Composite还是Leaf),因为这些角色中都具备了这些方法。

7.代码示例:

Image.png

安全式:

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();
    }
}