装饰者模式
设计模式源码git地址:design-pattern-src: 设计模式源码 (gitee.com)
该模式又称套娃模式
- 应用场景
- 场景举例
- Java实现
应用场景
大家都见过流中套娃的写法,类似如下
1 | new BufferedInputStream(new FileInputStream(new File(""))); |
如类似的实现关系,如图
装饰者模式就是这样的写法,将对象动态增加功能,而不改变原有的功能
怎么体现不改变原有代码,而动态增加职责?
场景举例
目前有一个咖啡接口,可以有众多咖啡实现,比如星巴克,瑞幸,类图如下,这也是原始的代码
类代码如下
接口
1 | public interface ICoffee { |
星巴克
1 | public class StarBucksCoffee implements ICoffee{ |
瑞幸
1 | public class LukinCoffee implements ICoffee { |
如果我现在打算在每种具体的咖啡加增加口味,如何进行修改?
有人说,那我直接在咖啡接口中增加一个加调味品的方法就行了,这好吗?这不好。违反了开闭原则(OCP原则)
新增一个装饰器类也去实现咖啡的方法,在之前父类制作咖啡的方法增加额外的方法,比如加糖,加牛奶。
Java实现
装饰器抽象类
1 | public abstract class DecoratorSpice implements ICoffee{ |
加糖
1 | public class SugarDecorator extends DecoratorSpice { |
加牛奶
1 | public class MilkDecorator extends DecoratorSpice { |
调用
1 | LukinCoffee lukinCoffee = new LukinCoffee(); |
优点:可以看出在不改变源码的情况下,动态的增加了功能
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 柠檬大师的空间站!
评论