将抽象和具体实现两个维度分离,让他们独立发展,并且在抽象类里聚合一个具体实现,通过聚合替代继承,用于解决类爆炸的问题。
这种模式要求对系统的抽象的理解和设计难度都比较大。
例子:
这里要对花,气球等装饰物进行显示,可以显示一个装饰物,也可以显示多个装饰物,那么将装饰物作为具体实现,将显示作为抽象类,在抽象类里有一个装饰物的引用,对抽象类进行扩展可以进行多次显示,对具体实现扩展为不同类型装饰物。
Display,NumberDisplay
DisplayImpl, FlowerDisplayImpl, BalloonDisplayImpl
具体代码:
public class Display { private DisplayImpl displayImpl; public Display(DisplayImpl displayImpl) { this.displayImpl = displayImpl; } public void print() { displayImpl.print(); } public void show() { print(); } }
public abstract class DisplayImpl { abstract void print(); }
public class NumberDisplay extends Display{ public NumberDisplay(DisplayImpl displayImpl) { super(displayImpl); } /** * 要多次显示 * @param time */ public void showManyTimes(int time) { if (time>0) { for (int i = 0; i < time; i++) { show(); } } } }
public class FlowerDisplayImpl extends DisplayImpl{ /** 花名 */ private String name; public FlowerDisplayImpl(String name) { this.name = name; } @Override void print() { System.out.println("Flower " + name); } }
public class BalloonDisplayImpl extends DisplayImpl{ /** 颜色 */ private String color; public BalloonDisplayImpl(String color) { this.color = color; } @Override void print() { System.out.println("Balloon " + color); } }
测试场景:我要显示Rose花,显示各种颜色的气球,还要显示多个。
public class Test { public static void main(String[] args) { FlowerDisplayImpl flower = new FlowerDisplayImpl("Rose"); BalloonDisplayImpl balloon = new BalloonDisplayImpl("red"); Display display = new Display(flower); display.show(); display = new Display(balloon); display.show(); NumberDisplay numberDisplay = new NumberDisplay(flower); numberDisplay.showManyTimes(101); balloon = new BalloonDisplayImpl("green"); numberDisplay = new NumberDisplay(balloon); numberDisplay.showManyTimes(20); balloon = new BalloonDisplayImpl("yellow"); numberDisplay = new NumberDisplay(balloon); numberDisplay.showManyTimes(20); } }