设计模式 - 浅谈组合模式

组合模式

模式功能说明:它可以让你将对象组合成树形结构,并且能像使用独立对象一样使用它们。

模式思路与原理

它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

示例

// Component
abstract class Graphic {
    public abstract void print();
}

// Leaf
class Circle extends Graphic {
    @Override
    public void print() {
        System.out.println("Circle");
    }
}

// Leaf
class Square extends Graphic {
    @Override
    public void print() {
        System.out.println("Square");
    }
}

// Composite
class CompositeGraphic extends Graphic {
    private List<Graphic> graphics = new ArrayList<>();

    public void add(Graphic graphic) {
        graphics.add(graphic);
    }

    public void remove(Graphic graphic) {
        graphics.remove(graphic);
    }

    @Override
    public void print() {
        for (Graphic graphic : graphics) {
            graphic.print();  // Delegation
        }
    }
}

public class Main {
    public static void main(String[] args) {
        // Initialize four ellipses
        Circle circle1 = new Circle();
        Circle circle2 = new Circle();
        Circle circle3 = new Circle();
        Square square = new Square();

        // Initialize three composite graphics
        CompositeGraphic graphic = new CompositeGraphic();
        CompositeGraphic graphic1 = new CompositeGraphic();
        CompositeGraphic graphic2 = new CompositeGraphic();

        // Composes the graphics
        graphic1.add(circle1);
        graphic1.add(circle2);

        graphic2.add(circle3);
        graphic2.add(square);

        graphic.add(graphic1);
        graphic.add(graphic2);

        // Prints the complete graphic (four times the string "Ellipse").
        graphic.print();
    }
}

Graphic是组件,CircleSquare是叶子,CompositeGraphic是复合组件。我们可以看到,无论是叶子还是复合组件,它们都有共同的方法print(),这样我们就可以像使用独立对象一样使用它们。

优缺点

优点:

  1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
  2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

缺点:

  1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
  2. 不容易限制容器中的构件;
  3. 不容易用继承的方法来增加构件的新功能;

总结

组合模式的实现原则是“单一职责原则”,即一个类应该只有一个引起变化的原因。 当想表示对象的部分-整体层次结构,或希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。则可以使用该模式。


本文链接:

https://pugqq.com/archives/combination-pattern.html
设计模式 - 浅谈组合模式 - I/O
快来做第一个评论的人吧~

# 最近更新

Nginx的proxy_pass指令完全拆解2021-03-21

Nginx配置Jenkins域名访问2021-01-03

设计模式 - 浅谈备忘录模式2020-12-02

设计模式 - 浅谈中介者模式2020-11-23

设计模式 - 浅谈迭代器模式2020-11-02

MySQL5.7 字符集设置2020-10-26

设计模式 - 浅谈状态模式2020-10-23

设计模式 - 浅谈访问者模式2020-10-13

设计模式 - 浅谈观察者模式2020-10-12

设计模式 - 浅谈命令模式2020-09-21