结构型模式 - 装饰器模式

系列文章目录

设计模式 - 设计原则

创建型模式 - 单例模式(一)
创建型模式 - 工厂模式(二)
创建型模式 - 原型模式(三)
创建型模式 - 建造者模式(四)

结构型模式 - 适配器模式(一)
结构型模式 - 桥接模式(二)
结构型模式 - 装饰器模式(三)
结构型模式 - 组合模式(四)
结构型模式 - 外观模式(五)
结构型模式 - 享元模式(六)
结构型模式 - 代理模式(七)

行为型模式 - 模板方法模式(一)
行为型模式 - 命令模式(二)
行为型模式 - 访问者模式(三)
行为型模式 - 迭代器模式(四)
行为型模式 - 观察者模式(五)
行为型模式 - 中介者模式(六)
行为型模式 - 备忘录模式(七)
行为型模式 - 解释器模式(八)
行为型模式 - 状态模式(九)
行为型模式 - 策略模式(十)
行为型模式 - 责任链模式(十一)



前言

代码地址


一、装饰器模式

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值