系列文章目录
创建型模式 - 单例模式(一)
创建型模式 - 工厂模式(二)
创建型模式 - 原型模式(三)
创建型模式 - 建造者模式(四)
结构型模式 - 适配器模式(一)
结构型模式 - 桥接模式(二)
结构型模式 - 装饰器模式(三)
结构型模式 - 组合模式(四)
结构型模式 - 外观模式(五)
结构型模式 - 享元模式(六)
结构型模式 - 代理模式(七)
行为型模式 - 模板方法模式(一)
行为型模式 - 命令模式(二)
行为型模式 - 访问者模式(三)
行为型模式 - 迭代器模式(四)
行为型模式 - 观察者模式(五)
行为型模式 - 中介者模式(六)
行为型模式 - 备忘录模式(七)
行为型模式 - 解释器模式(八)
行为型模式 - 状态模式(九)
行为型模式 - 策略模式(十)
行为型模式 - 责任链模式(十一)
文章目录
前言
一、装饰器模式
1.1 装饰器模式介绍
- 装饰器(Decorator)模式:
- 在
不改变现有对象结构的情况下,动态地给该对象增加一些职责
(即增加其额外功能);创建一个装饰类,用来包装原有的类,并在保持类的方法签名完整的前提下,提供额外功能
;
1.2 装饰器模式结构
- 抽象构建(Component)角色:
- 定义一个接口抽象以规范准备接受附加责任的对象;
- 具体构建(Concrete Component)角色:
- 实现抽象构建(Component),通过装饰角色为其添加一些职责;
- 抽象装饰(Decorator)角色:
- 继承抽象构件(Component)并包含具体构建(Concrete Component)的实例,可以通过其子类扩展具体构件的功能;
- 具体装饰(Concrete Decorator)角色:
- 实现抽象装饰(Decorator)相关方法,并给具体构件(Concrete Component)对象添加附加的责任;
二、实现
例子:
- 张三: 李四啊,现在直播那么挣钱,我昨天转行做主播了,但是开了直播,没人捧场,可能是我长得丑,咋办呢?
- 李四:现在流行开美颜,你看谁谁都美颜成啥了,你要不试试?。
- 张三开启了美颜直播,一大堆土豪开始刷礼物了。。。
2.1 装饰器实现
package com.dozezz.designpattern.decorator;
/**
* @Description:直播接口
* @Author: dozezz
* @Date: 2021/7/19 15:38
* @Version: 1.0
*/
public interface ILiveTelecast {
void liveTelecast();
}
package com.dozezz.designpattern.decorator;
/**
* @Description: 张三的直播生涯
* @Author: dozezz
* @Date: 2021/7/19 19:37
* @Version: 1.0
*/
public class ZhangsanLiveTelecast implements ILiveTelecast {
@Override
public void liveTelecast() {
System.out.println("张三的直播生涯开始。。。");
}
}
package com.dozezz.designpattern.decorator;
/**
* @Description: 视频直播装饰器
* @Author: dozezz
* @Date: 2021/7/19 19:43
* @Version: 1.0
*/
public interface ILiveTelecastDecorator extends ILiveTelecast{
void enableMeiyan();
}
package com.dozezz.designpattern.decorator;
/**
* @Description: 美颜装饰器,装饰谁?装饰器只关心增强这个类的方法,
* 装饰谁?
*
* @Author: dozezz
* @Date: 2021/7/19 19:44
* @Version: 1.0
*/
public class MeiyanDecorator implements ILiveTelecastDecorator {
private ILiveTelecast liveTelecast;
public MeiyanDecorator(ILiveTelecast liveTelecast) {
this.liveTelecast = liveTelecast;
}
@Override
public void liveTelecast() {
//开启美颜
enableMeiyan();
//开始直播,干本职工作
liveTelecast.liveTelecast();
}
/**
* 装饰器定义的增强功能,功能增强不用连接外人,是在装饰器里面写的,
*/
@Override
public void enableMeiyan() {
System.out.println("我曹,这个女的长得真好看,爱了爱了。。");
System.out.println("火箭、游轮、飞机刷起来。。。");
}
}
package com.dozezz.designpattern.decorator;
/**
* @Description: 测试类
* @Author: dozezz
* @Date: 2021/7/19 19:34
* @Version: 1.0
*/
public class ClientTest {
public static void main(String[] args) {
//被装饰对象(如果是被适配对象呢?)
ILiveTelecast telecast = new ZhangsanLiveTelecast();
// telecast.liveTelecast();
ILiveTelecastDecorator meiyanDecorator = new MeiyanDecorator(telecast);
meiyanDecorator.liveTelecast();
}
}
package com.dozezz.designpattern.bridge.bridge;
/**
* @Description: 線上渠道
* @Author: dozezz
* @Date: 2021/7/17 19:46
* @Version: 1.0
*/
public class OnlineSale extends AbstractSale{
public OnlineSale(String type, String price) {
super(type, price);
}
}
- 稍微变下就变成了适配器模式了
package com.dozezz.designpattern.decorator;
/**
* @Description: 美颜装饰器,装饰谁?装饰器只关心增强这个类的方法,
* 装饰谁?
*
* @Author: dozezz
* @Date: 2021/7/19 19:44
* @Version: 1.0
*/
public class MeiyanDecorator implements ILiveTelecastDecorator {
private ILiveTelecast liveTelecast;
// private IThirdParty thirdParty;
public MeiyanDecorator(ILiveTelecast liveTelecast) {
this.liveTelecast = liveTelecast;
}
@Override
public void liveTelecast() {
//开启美颜
enableMeiyan();
// 美颜我不会,调用第三方的组件,就变曾成为适配器模式了
// thirdParty.enableMeiyan();
//开始直播,干本职工作
liveTelecast.liveTelecast();
}
/**
* 装饰器定义的增强功能,功能增强不用连接外人,是在装饰器里面写的,
*/
@Override
public void enableMeiyan() {
System.out.println("我曹,这个女的长得真好看,爱了爱了。。");
System.out.println("火箭、游轮、飞机刷起来。。。");
}
}
三、装饰器模式总结
3.1 装饰器模式适用场景
- 当你想要给一个类增加功能,然而却不想修改原来类的代码时,可以考虑装饰器模式;
- 如果你想要动态的给一个类增加功能,并且这个功能你还希望可以动态的撤销,就好像直接拿掉一层装饰物时;
3.2 装饰器模式与适配器模式区别
- 适配器是连接两个类,可以增强一个类,装饰器是增强一个类;
3.3 装饰器模式与桥接模式区别
- 装饰器模式中,使用组合而不是继承对类的功能进行扩展,避免了类的个数的爆炸增长,与桥梁模式的结果相同,都解决了类爆炸增长的问题,都避免了过多没用的子类;
- 装饰器模式侧重于功能的动态增加,将额外的功能提取到子类中,更关注于
功能的动态扩展组合
;- 桥接模式是将原本系统中的实现细节抽取出来,比如原本抽象概念与实例化全部都是一个类层次结构中,把所有实现细节,比如示例中的渠道相关实现,抽取出来,进行分离,达到抽象与实现分离的目的,更关注与
抽象与实现的分离,获得更多的灵活性
;
3.4 装饰器模式优缺点
- 装饰器模式遵守开闭原则;
- 装饰器模式是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用;
- 通过使用不用装饰类记这些装饰的排列组合,可以实现不同效果;
- 装饰器模式会增加许多子类,过度使用会增加程序的复杂性;
四、参考文献
http://c.biancheng.net/view/1366.html
https://www.cnblogs.com/noteless/p/9603041.html
https://www.bilibili.com/video/BV1G4411c7N4?p=54&spm_id_from=pageDriver