主页 > 家居 > 「设计模式」Decorator(装饰者模式)

「设计模式」Decorator(装饰者模式)

佚名 家居 2020年11月29日

「设计模式」Decorator(装饰者模式)

版权声明

本文由“开发者手册”原创,如需转载,请标明出处。


装饰者模式基本介绍

装饰者模式可以在不改变原有对象的基础之上,将功能附加到对象上提供了比继承更有弹性的替代方案


适用场景


扩展一个类的功能或者给一个类添加附加职责


模式特点


通过使用不同装饰类以及这些类的排列组合,可以实现不同的效果。




如果你还想学习其他设计模式,请参考我的另一篇文章:「设计模式」设计模式总概


类图

主要角色说明:


  • Component:组件抽象类(定义被装饰的抽象组件)
  • ConcreteComponent:组件具体类(被装饰的具体组件)
  • Decorator:装饰者抽象类(定义装饰组件,内部引用了被装饰组件)
  • ConcreteDecorator:装饰者具体实现类

代码实现

以显示生活中买奶茶加珍珠和椰果计算价格为例


Component(组件抽象类)


/** * 饮料接口(属于Component角色) */public interface Yinliao { /** * 价格 * @return */ double price(); }

ConcreteComponent(组件具体类)


/** * 奶茶(属于饮料的一种)(属于ConcreteComponent角色) */public class Naicha implements Yinliao { @Override public double price() { return 12.00;// 奶茶原价12.00元 } }

Decorator(装饰者抽象类)


/** * 饮料装饰者(属于Decorator角色) */public abstract class Decorator implements Yinliao { /** 被装饰的饮料 */ private Yinliao yinliao; public Decorator(Yinliao yinliao){ this.yinliao = yinliao; } public Yinliao getYinliao() { return yinliao; } public void setYinliao(Yinliao yinliao) { this.yinliao = yinliao; }}

ConcreteDecorator(装饰者具体实现类)


/** * 加珍珠(属于ConcreteDecorator角色) * 珍珠每份1.00元 */public class Zhenzhu extends Decorator { public Zhenzhu(Yinliao yinliao) { super(yinliao); } @Override public double price() { return 1.00 + this.getYinliao().price(); } }

/** * 加椰果(属于ConcreteDecorator角色) * 椰果每份1.50元 */public class Yeguo extends Decorator { public Yeguo(Yinliao yinliao) { super(yinliao); } @Override public double price() { return 1.50+this.getYinliao().price(); } }

测试类


/** * 装饰者模式测试类 */public class DecoratorTest { public static void main(String[] args) { Yinliao naicha = new Naicha(); System.out.println(naicha.price());//输出(奶茶原)价格:12.0 Decorator naicha_zhenzhu = new Zhenzhu(naicha);//加珍珠 System.out.println(naicha_zhenzhu.price());//输出(奶茶+珍珠)价格:13.0 Decorator naicha_zhegnzhu_yeguo = new Yeguo(naicha_zhenzhu);//再加椰果 System.out.println(naicha_zhegnzhu_yeguo.price());//输出(奶茶+珍珠+椰果)价格:14.5 }}

结束语

希望我的文章能给您带来帮助,如果您有什么疑问,可以给我留言,我会在第一时间给您提供解答。如果您有好的建议或想法,也欢迎给我留言。


标签: 装饰   模式   he   in