文章目录
什么是装饰模式
指的是在不改变现有对象结构的情况下,动态地给对象增加一些职责(即增加其额外功能)的模式.
装饰模式的功能
- 动态的为一个对象增加新的对象
- 装饰模式是一种用替代继承的技术,无需通过继承增加子类就能扩展对象的新功能.使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀.
实现细节
component抽象构建角色
真实对象和装饰对象有相同额接口,这样,客户端对象就能够以真实对象相同的方式同装饰对象交互.
ConcreteComponent具体构件角色(真实对象)
- IO流中的FileInputStream、FileOutputStream
Decorate装饰角色
- 持有一个抽象构建的引用,装饰对象接受所有客户端的请求,并把请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。
ConcreteDecorator具体装饰角色
- 负责给构件对象增加新的特性。
经典案例:用装饰模式为车添加功能
抽象构件;车
/*
* 抽象构件:车
*/
public interface ICar {
void move();
}
装饰角色(依赖实现了ICar接口的类):superCar
//Decorator装饰角色
public class SuperCar implements ICar {
protected ICar car;
public SuperCar(ICar car) {
// TODO Auto-generated constructor stub
this.car=car;
}
@Override
public void move() {
// TODO Auto-generated method stub
car.move();
}
}
原始的真实对象:Car
/*
* 具体构建角色(真实对象)
*/
public class Car implements ICar {
@Override
public void move() {
// TODO Auto-generated method stub
System.out.println("陆地行驶!");
}
}
具有功能的真实对象:
/*
* 装饰后角色:会飞的车
*/
class FlyCar extends SuperCar{
public FlyCar(ICar car) {
super(car);
// TODO Auto-generated constructor stub
}
public void fly() {
System.out.println("天上行驶");
}
@Override
public void move() {
car.move();
fly();
}
}
//被装饰的角色:会游泳的车
class WaterCar extends SuperCar {
public WaterCar(ICar car) {
super(car);
}
public void swim(){
System.out.println("水上行驶");
}
@Override
public void move() {
car.move();
swim();
}
}
测试代码:
public class Test {
public static void main() {
//真实角色
Car car=new Car();
//给角色装上飞行功能
FlyCar flyCar = new FlyCar(car);
//在装了飞行功能的基础上继续装入游泳
WaterCar waterCar1 = new WaterCar(flyCar);
}
}