装饰器的作用是使得被装饰者功能更强大,而且装饰前后的使用方式不变。Java I/O类库中有许多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的。
1、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
2、具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
3、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
4、具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
1、应用场景
Io流,抽象构建,InputStream,如图
那么它的具体构建 FileInputStram,如图
为了增加一些额外的功能,需要用到装饰类,FilterInputStream,如图,怎么知道它是装饰类呢,你看代码里,protected volatile InputStram in,这个是所有装饰类的一个共同特点
具体抽象角色 BufferedInputStram:如图
很明显它的抽象具体角色和具体构建类是不同的,他们之间的那个抽象类不管是implements 或者extends也好,但是共同点必须是把要抽象的构建类作为装饰类的对象。
代码实现
2.1 抽象组件
public interface Car {
void name();
}
2.2具体抽象组件
public class MCar implements Car {
@Override
public void name() {
}
}
2.3 装饰组件,这个所有装饰类一个共同点,引入抽象组件进来
public class DecoratorCar implements Car {
private Car car;
public DecoratorCar(Car car){
this.car = car;
}
@Override
public void name() {
car.name();
}
}
2.4 具体装饰
public class MyDecoratorCar extends DecoratorCar {
public MyDecoratorCar(Car car) {
super(car);
}
public void say(){
System.out.println("扩展功能");
}
@Override
public void name() {
super.name();
say();
}
}
main函数执行
public class Main {
public static void main(String[] args){
Car car = new MCar();
car.name();
MyDecoratorCar myDecoratorCar = new MyDecoratorCar(car);
myDecoratorCar.say();
}
}
总结
1、关键点在装饰类! 它引入了最初始的类,这就是装饰类!
2、不要因为有些博客代码中又用到了多少extends 就有一些茫然,其实装饰设计模式跟这个没有关系,重点就在装饰类。
如图,记住这个核心的写法。
从不影响原使类,只在具体子类添加对应的扩展功能。