开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情
觉得对你有益的小伙伴记得点个赞+关注
后续完整内容持续更新中
希望一起交流的欢迎发邮件至javalyhn@163.com
1. 装饰器模式定义
装饰器是增强一个类
创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
2. 装饰器模式角色说明
抽象构件(Component)角色:
- 定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(ConcreteComponent)角色:
- 实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色:
- 继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(ConcreteDecorator)角色:
- 实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
3. 装饰器模式使用场景
- 需要扩展一个类的功能,或给一个类增加附加功能。
- 需要动态的给一个雷甜家功能,这些功能可以再动态的撤销。
- 需要为一批的兄弟类进行改装或加装功能。
4. 装饰器模式的实现
我们给定以下某音实现美颜场景。
ManTikTok
/**
* 抽象构建
*/
public interface ManTikTok {
void tiktok();
}
ZhangTikTok
public class ZhangTikTok implements ManTikTok{
@Override
public void tiktok() {
System.out.println("张三,tiktok.... ");
}
}
LeiTikTok
public class LeiTikTok implements ManTikTok{
@Override
public void tiktok() {
System.out.println("雷,tiktok.... ");
}
}
TiktokDecorator
/**
* 抽象装饰器
* 某音直播装饰器
*/
public interface TiktokDecorator extends ManTikTok{
void enable();
}
MeiYanDecorator
/**
* 美颜装饰器
* 装饰谁?
*
* 装饰器只关系增强这个类的方法。
*/
public class MeiYanDecorator implements TiktokDecorator{
// private Framework framework; 适配器
private ManTikTok manTikTok;
public MeiYanDecorator(ManTikTok manTikTok){
this.manTikTok = manTikTok;
}
@Override
public void tiktok() {
//开启美颜
enable();
//
// framework.enableMeiYan();
//我开始直播
manTikTok.tiktok();
}
/**
* 定义的增强功能
*/
@Override
public void enable() {
System.out.println("看这个美女.....");
System.out.println("花花花花花花花花花花花");
}
}
MainTest
/**
* 核心:想要不改变原来接口方法的情况下扩展新功能,或者增强方法.....
*/
public class MainTest {
public static void main(String[] args) {
//被装饰对象
ManTikTok manTikTok = new LeiTikTok();
// manTikTok.tiktok();
/**
* LiMingTiktokProxy proxy = new LiMingTiktokProxy(new LeiTikTok());
* proxy.tiktok();
*/
MeiYanDecorator decorator = new MeiYanDecorator(manTikTok);
decorator.tiktok();
}
}
5. 装饰器模式优缺点
5.1 优点
- 装饰类和被装饰类可以独立发展,而不会相互耦合。
- 装饰器模式是继承关系的一种替代方案。
- 装饰器模式可以动态的拓展一个实现类的功能
5.2 缺点
多层的装饰是比较复杂的,就像剥洋葱一样,你剥到了最后才发现是最里层的装饰出现了问题,想想一下有多少的工作量吧,因此尽量减少装饰类的数量,以便降低系统的并发度。