装饰器模式(Decorator、Wrapper(包装) Pattern)
# 装饰器模式(Decorator、Wrapper(包装) Pattern)
适配器是连接两个类,可以增强一个类,装饰器是增强一个类
向一个现有的对象添加新的功能,同时又不改变其结构。属于对象结构型模式。
创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

抽象构件(Component)角色:
定义一个抽象接口以规范准备接收附加责任的对象。
/**
*抽象构件
*/
public interface ManTikTok {
void tiktok();
}
1
2
3
4
5
6
2
3
4
5
6
具体构件(ConcreteComponent)角色:
实现抽象构件,通过装饰角色为其添加一些职责。
public class MiTikTok implements ManTikTok {
@Override
public void tiktok() {
System.out.println("雷军在抖音直播中");
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
抽象装饰(Decorator)角色:
继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
/**
* 抽象装饰
*/
public interface TiktokDecorator extends ManTikTok{
void enable();
}
1
2
3
4
5
6
2
3
4
5
6
具体装饰(ConcreteDecorator)角色:
实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
/**
* 装饰器只关心增强这个类的方法
*/
public class MeiYanDecorator implements TiktokDecorator{
//装饰谁?
private ManTikTok manTikTok;
public MeiYanDecorator(ManTikTok manTikTok) {
this.manTikTok = manTikTok;
}
@Override
public void tiktok() {
//保留之前的功能
manTikTok.tiktok();
//开启增强功能
enable();
}
//定义了增强功能
@Override
public void enable() {
System.out.println("开启推广直播间");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
测试方法
public static void main(String[] args) {
//被装饰对象
MiTikTok miTikTok = new MiTikTok();
miTikTok.tiktok();
MeiYanDecorator decorator = new MeiYanDecorator(miTikTok);
decorator.tiktok();
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 应用场景
无处不在.....
SpringSession 中如何进行 session 与 redis 关联?HttpRequestWrapper
session:数据存在了内存
session:数据存在 redis
HttpSession;getAttribute();
Wrapper(session){ getAttribute(String param){ redis.get(param) }; }1
2
3
4
5
MyBatisPlus 提取了 QueryWrapper,这是什么?
Spring 中的 BeanWrapper 是做什么?包装了 Bean。bean 的功能增强?
Spring Webflux 中的 WebHandlerDecorator?
已存的类,每一天在某个功能使用的时候发现不够,就可以装饰器。
Java 的 IO 结构,FilterInputStream 就是一个装饰者

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.InputStream;
public class Decorator {
public static void main(String[] args) throws Exception {
// TODOAuto-generated method stub
//说明
//1. InputStream 是抽象类, 类似我们前面讲的 Drink
//2. FileInputStream 是 InputStream 子类,类似我们前面的 DeCaf, LongBlack
//3. FilterInputStream 是 InputStream 子类:类似我们前面 的 Decorator 修饰者
//4. DataInputStream 是 FilterInputStream 子类,具体的修饰者,类似前面的 Milk, Soy 等
//5. FilterInputStream 类 有 protected volatile InputStream in; 即含被装饰者
//6. 分析得出在 jdk 的 io 体系中,就是使用装饰者模式
DataInputStream dis = new DataInputStream(new FileInputStream("d:\\abc.txt"));
System.out.println(dis.read());
dis.close();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02