前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式之 - 装饰者模式

设计模式之 - 装饰者模式

作者头像
一个程序员的成长
发布2020-11-25 15:22:50
2990
发布2020-11-25 15:22:50
举报
文章被收录于专栏:bingfeng-技术

阅读本文大概需要4分钟

一、什么是装饰者模式

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

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

二、装饰者模式的构成

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

三、实例演示

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

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

代码语言:javascript
复制
public interface MilkyTea {

    public void recipe();
}

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

代码语言:javascript
复制
public class MilkyTeaA implements MilkyTea {
    
    @Override
    public void recipe() {

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

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

代码语言:javascript
复制
public class Decorator implements MilkyTea {

    private MilkyTea milkyTea;

    public void setMilkyTea(MilkyTea milkyTea) {

        this.milkyTea = milkyTea;
    }

    @Override
    public void recipe() {

        milkyTea.recipe();
    }
}

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

代码语言:javascript
复制
public class MilkyTeaADecorator extends Decorator {

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

    // 加珍珠
    public void recipeZZ() {

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

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

代码语言:javascript
复制
public class MilkyTeaBDecorator extends Decorator {

    @Override
    public void recipe() {

        super.recipe();
        recipeHD();
    }

    public void recipeHD() {

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

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

代码语言:javascript
复制
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();
    }
}

四、模式总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一个程序员的成长 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档