博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之 - 装饰者模式
阅读量:7242 次
发布时间:2019-06-29

本文共 1818 字,大约阅读时间需要 6 分钟。

hot3.png

一、什么是装饰者模式

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

我们来看下装饰者模式的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();   }}

四、模式总结

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

装饰模式的优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类;

转载于:https://my.oschina.net/u/3178270/blog/2906791

你可能感兴趣的文章
CSS魔法堂:Absolute Positioning就这个样
查看>>
PostgreSQL standby in 64bit to 32bit or reverse enviroment
查看>>
PostgreSQL 如何潇洒的处理每天上百TB的数据增量
查看>>
架构师画像
查看>>
一分钟了解阿里云产品:消息队列
查看>>
(二十三)变量名的命名
查看>>
如何保证摘除公网EIP的容器服务VPC集群可以正常访问公网
查看>>
linux进程状态浅析
查看>>
【JavaScript】DOM节点常用方法介绍02
查看>>
非官方统计2018微信年度账单实现
查看>>
微信小程序练手 demo 之天气小程序总结(流水账)
查看>>
异步操作系列之Generator函数与Async函数
查看>>
水平无限循环弹幕的实现
查看>>
老前端出坑小程序(一)
查看>>
别躲了,机器知道你们的关系
查看>>
mac配置完ssh依然提示"Enter passphrase for key"解决方法
查看>>
java面试
查看>>
前端日刊君来也
查看>>
20190119杂七杂八
查看>>
Here are some practical JavaScript objects that have encapsulation (翻译)
查看>>