装饰模式(decorator):是一种用于代替继承的技术;
无需通过继承添加子类就可以扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
案例:
如果我们要实现如上的类图关系,首先肯定是使用继承;但是如果以后要扩展出水上+飞行汽车、水上+智能汽车、飞行+智能汽车......岂不是又要添加新的子类。
利用装饰模式实现以上类图关系:
实现代码:
//抽象组件 public interface ICar { void move(); } //真实构建 class Car implements ICar{ @Override public void move() { System.out.println("普通汽车跑!"); } } //装饰角色 class SuperCar implements ICar{ //真实对象的引用 protected ICar car; public SuperCar(ICar car) { super(); this.car = car; } @Override public void move() { car.move(); } } //真实的装饰角色 class FlyCar extends SuperCar{ public FlyCar(ICar car) { super(car); } public void fly(){ System.out.println("天上飞!"); } @Override public void move() { super.move(); fly(); } } //真实的装饰角色 class WaterCar extends SuperCar{ public WaterCar(ICar car) { super(car); } public void swim(){ System.out.println("水里游!"); } @Override public void move() { super.move(); swim(); } } //真实的装饰角色 class AICar extends SuperCar{ public AICar(ICar car) { super(car); } public void autoMove(){ System.out.println("自动驾驶!"); } @Override public void move() { super.move(); autoMove(); } }
测试类:
public class Client { public static void main(String[] args) { ICar car = new Car(); car.move(); System.out.println("----------添加飞行功能----------"); FlyCar flyCar = new FlyCar(car); flyCar.move(); System.out.println("----------添加飞行+自动驾驶功能----------"); AICar aICar = new AICar(flyCar); aICar.move(); } }
测试结果:
可以看到我们可以通过组合的形式方便的创建新的模式。