设计模式 - 浅谈组合模式
组合模式
模式功能说明:它可以让你将对象组合成树形结构,并且能像使用独立对象一样使用它们。
模式思路与原理
它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
示例
// 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()
,这样我们就可以像使用独立对象一样使用它们。
优缺点
优点:
- 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
- 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
缺点:
- 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
- 不容易限制容器中的构件;
- 不容易用继承的方法来增加构件的新功能;
总结
组合模式的实现原则是“单一职责原则”,即一个类应该只有一个引起变化的原因。 当想表示对象的部分-整体层次结构,或希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。则可以使用该模式。