专栏首页bingfeng-技术设计模式之 - 装饰者模式

设计模式之 - 装饰者模式

阅读本文大概需要4分钟

一、什么是装饰者模式

装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。

我们来看下装饰者模式的UML图:

二、装饰者模式的构成

  • Component(抽象构件):它是装饰类和具体构件的公共父类;
  • ConcreteComponent(具体构件):具它是抽象构件对象的子类,用来定义具体的构件对象;
  • Decorator(抽象装饰类):进继承抽象构件,用于给具体的构件添加一些新的职责;
  • ConcreteDecoraror(具体装饰类):实现了抽象装饰类,它负责向构件添加新的职责;

三、实例演示

业务场景:现我们现在模拟这样一个场景,我们点了一杯奶茶,然后给奶茶中加了冰块,加了珍珠,最后我们还想再给加点红豆,这里加红豆就使用了装饰者。

我们下来创建一个奶茶的抽象类,想到于Component

public interface MilkyTea {

    public void recipe();
}

我们再来创建要给奶茶的具体子类,相当于ConcreteComponent

public class MilkyTeaA implements MilkyTea {
    
    @Override
    public void recipe() {

        System.out.println("老板来一杯奶茶,加冰块");
    }
}

接下来创建一个装饰类,相当于Decorator

public class Decorator implements MilkyTea {

    private MilkyTea milkyTea;

    public void setMilkyTea(MilkyTea milkyTea) {

        this.milkyTea = milkyTea;
    }

    @Override
    public void recipe() {

        milkyTea.recipe();
    }
}

创建装饰类的子类,添加珍珠,相当于ConcreteDecorator

public class MilkyTeaADecorator extends Decorator {

    @Override
    public void recipe() {
        super.recipe();
        recipeZZ();
    }

    // 加珍珠
    public void recipeZZ() {

        System.out.println("老板再加点珍珠吧");
    }
}

创建装饰者的子类,添加红豆,相当于ConcreteDecorator

public class MilkyTeaBDecorator extends Decorator {

    @Override
    public void recipe() {

        super.recipe();
        recipeHD();
    }

    public void recipeHD() {

        System.out.println("老板你再给加点红豆吧");
    }
}

最后我们测试一下看下结果:

public class Test {

    public static void main(String[] args) {

        MilkyTeaA milkyTea = new MilkyTeaA();

        MilkyTeaADecorator milkyTeaA = new MilkyTeaADecorator();
        MilkyTeaBDecorator milkyTeaB = new MilkyTeaBDecorator();

        milkyTeaA.setMilkyTea(milkyTea);
        milkyTeaB.setMilkyTea(milkyTeaA);

        milkyTeaB.recipe();
    }
}

四、模式总结

通过这个小例子我们可以发现,装饰者模式是为了已有的功能动态的添加更多功能的一种方式。

本文分享自微信公众号 - 一个程序员的成长(xiaozaibuluo),作者:一个程序员的成长

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式之-代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。简单来说这就是给目标对象生成一个代理对象,并由代理对象控制对目标对象的引用。

    一个程序员的成长
  • RabbitMQ工作队列之公平分发消息与消息应答(ACK)

    上篇文章中,我们讲了工作队列轮询的分发模式,该模式无论有多少个消费者,不管每个消费者处理消息的效率,都会将所有消息平均的分发给每一个消费者,也就是说,大家最后各...

    一个程序员的成长
  • @PostConstruct注解,你该好好看看

    做过微信或支付宝支付的童鞋,可能遇到过这种问题,就是填写支付结果回调,就是在支付成功之后,支付宝要根据我们给的地址给我们进行通知,通知我们用户是否支付成功,如果...

    一个程序员的成长
  • C# 数据操作系列 - 16 SqlSugar 完结篇

    前一篇我们详细的介绍了SqlSugar的增删改查,那些已经满足我们在日常工程开发中的使用了。但是还有一点点在开发中并不常用,但是却非常有用的方法。接下来让我们一...

    程序员小高
  • Head First设计模式——生成器模式和责任链模式

    现又一个度假计划指定,需要指定度假每一天的活动、旅馆、用餐、门票等等事情,但是每个客人的度假计划可能不太一样。例如天数、活动类型、用餐等等。

    SpringSun
  • .Net Core Logger 实现log写入本地文件系统

    .net core 自带一个基础的logger框架Microsoft.Extensions.Logging。

    旺财的城堡
  • 设计模式—— 十二 :代理模式

    代理模式是一种对象结构型模式。在代理模式中引入了一个新的代理对象,代理对象在客户 端对象和目标对象之间起到中介的作用,它去掉客户不能看到的内容和服务或者增添客户...

    三分恶
  • 我使用的Unity开发多语言处理方案

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    bering
  • IDEA黄色警告解析集锦 - 类名【xxx】应以Impl结尾

    对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别

    JavaEdge
  • 设计模式 里氏替换原则

    在场景中,三毛需要什么枪支,就直接new 出一个枪支即可,然后其内通过抽象类获取到对象,然后对齐进行修饰

    mySoul

扫码关注云+社区

领取腾讯云代金券