[设计模式] 浅谈组合模式

2024 年 4 月 29 日 星期一
/ ,
4

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

[设计模式] 浅谈组合模式

组合模式

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

模式思路与原理

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

案例

// 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是组件,Circle和Square是叶子,CompositeGraphic是复合组件。我们可以看到,无论是叶子还是复合组件,它们都有共同的方法print(),这样我们就可以像使用独立对象一样使用它们。

优缺点

优点:

  1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;

  2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

缺点:

  1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;

  2. 不容易限制容器中的构件;

  3. 不容易用继承的方法来增加构件的新功能;

总结

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

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...