设计模式:装饰模式
装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。
装饰模式功能角色:
抽象构建角色(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.各装饰对象可以相互持有引用或组合。
具体装饰类可将下一个具体装饰类包裹起来,动态增加新的功能。
装饰模式和继承关系的目的都是扩展对象功能,但装饰模式可以提供比继承更多灵活性。
装饰模式允许系统动态决定是否装饰某个类。继承则是在运行前就决定了。

浙公网安备 33010602011771号