装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。
装饰模式功能角色:
抽象构建角色(Component):真实对象和装饰对象有相同接口。
具体构建角色(ConcreteComponent):如Io中FileInputStream,
装饰角色(Decorator):持有一个抽象构建角色的引用。装饰对象接收所有客户端 的请求,并把这些请求转发给真实对象。
这样在真实对象调用前后增加新的功能。
具体装饰角色(ConcreteDecorator):复制给构建对象增加新功能
案例:
/** * 抽象组件 */ public interface ICar { void move(); } //被裝飾對象 class Car implements ICar { @Override public void move() { System.out.println("陸地上跑"); } } //装饰角色 Decorator class SuperCar implements ICar { private ICar car; public SuperCar(ICar car) { this.car = car; } @Override public void move() { car.move(); } } //具体装饰角色 ConcreteDecorator class FlyCar extends SuperCar { public FlyCar(ICar car) { super(car); } public void fly() { System.out.println("fly"); } @Override public void move() { super.move(); fly(); } } class WaterCar extends SuperCar { public WaterCar(ICar car) { super(car); } public void water() { System.out.println("water"); } @Override public void move() { super.move(); water(); } } class AiCar extends SuperCar { public AiCar(ICar car) { super(car); } public void ai() { System.out.println("auto"); } @Override public void move() { super.move(); ai(); } }
public class Client { public static void main(String[] args) { Car car = new Car(); car.move(); FlyCar flyCar = new FlyCar(car); flyCar.move(); WaterCar waterCar = new WaterCar(car); waterCar.move(); WaterCar waterCar1 = new WaterCar(flyCar); waterCar1.move(); } }
1.装饰类SuperCar中,持有一个装饰角色对象ICar.
2.此装饰类实现装饰构建ICar接口。
3.装饰模式的对象图从呈链状结构。例子共三个具体装饰类。FlyCar, WaterCar, AiCar.各装饰对象可以相互持有引用或组合。
具体装饰类可将下一个具体装饰类包裹起来,动态增加新的功能。
装饰模式和继承关系的目的都是扩展对象功能,但装饰模式可以提供比继承更多灵活性。
装饰模式允许系统动态决定是否装饰某个类。继承则是在运行前就决定了。