装饰器模式:
职责:
- 动态的为一个对象增加新的功能。
- 装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能拓展对象的新功能,使用对象的关联关系代替继承关系。更加灵活,同时能够避免类型体系的快速膨胀
实现细节:
- Component 抽象构件角色:
- · 真实对象和装饰对象具有相同的接口,这样客户端对象就能以与真实对象相同的方式通装饰对象交互。
- ConcreteComponent具体构件角色(真实对象):
- · io流中的FileInputStream , FileOutputStream
- Decorator 装饰角
- · 持有一个抽象构件的引用,装饰对象接收所有客户端的请求,并把这些请求转发给真实的对象,这样就能在真实对象调用前后增加新的功能。
- ConcreteDecorator 具体装饰角色:
- · 负责给构件对象增加新的功能
package cn.fllday.decorator;
//Component 抽象构件角色:
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();
}
}
// ConcreteDecorator 具体装饰角色
class FlyCar extends SuperCar{
public FlyCar(ICar car) {
super(car);
}
public void fly() {
System.out.println("天上飞");
}
@Override
public void move() {
super.move();
fly();
}
}
//ConcreteDecorator 具体装饰角色
class WaterCar extends SuperCar{
public WaterCar(ICar car) {
super(car);
}
public void swiming() {
System.out.println("水里游");
}
@Override
public void move() {
super.move();
swiming();
}
}
Client 调用
package cn.fllday.decorator;
public class Client {
public static void main(String[] args) {
Car car = new Car();
car.move();
System.out.println("增加新的飞行的Car ---");
FlyCar flyCar = new FlyCar(car);
flyCar.move();
System.out.println("增加水里游的Car ----");
WaterCar waterCar = new WaterCar(flyCar);
waterCar.move();
}
}
调用结果:
在地上跑
增加新的飞行的Car ---
在地上跑
天上飞
增加水里游的Car ----
在地上跑
天上飞
水里游