阅读本文大概需要4分钟
一、什么是装饰者模式
装饰着模式:简单的一句话理解就是,动态的给一个对象添加一些额外的功能,装饰者模式相对于生成子类更加的灵活。
我们来看下装饰者模式的UML图:
二、装饰者模式的构成
三、实例演示
业务场景:现我们现在模拟这样一个场景,我们点了一杯奶茶,然后给奶茶中加了冰块,加了珍珠,最后我们还想再给加点红豆,这里加红豆就使用了装饰者。
我们下来创建一个奶茶的抽象类,想到于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
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句