java类库中的 设计模式_掌握Java设计模式之装饰设计模式(7)

装饰器的作用是使得被装饰者功能更强大,而且装饰前后的使用方式不变。Java I/O类库中有许多不同的功能组合情况,这些不同的功能组合都是使用装饰器模式实现的。

1、抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。

2、具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。

3、装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。

4、具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。

1、应用场景

Io流,抽象构建,InputStream,如图

c401b97462ec968b2a75dd50a11fcdd7.png

那么它的具体构建 FileInputStram,如图

cc79c593b44d40ddb735be07f0636125.png

为了增加一些额外的功能,需要用到装饰类,FilterInputStream,如图,怎么知道它是装饰类呢,你看代码里,protected volatile InputStram in,这个是所有装饰类的一个共同特点

3c30039210092001129ff702581fff0a.png

具体抽象角色 BufferedInputStram:如图

0fe9ce92d5888f6e055a81c69a2dd2e1.png

很明显它的抽象具体角色和具体构建类是不同的,他们之间的那个抽象类不管是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 就有一些茫然,其实装饰设计模式跟这个没有关系,重点就在装饰类。

如图,记住这个核心的写法。

eace19647f1e354d4e34c95ff54af07d.png

从不影响原使类,只在具体子类添加对应的扩展功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值