如何理解这6种常见设计模式?( 三 )


装饰模式结构
装饰模式包含如下角色:

  • Component:抽象构件
  • ConcreteComponent:具体构件
  • Decorator:抽象装饰类
  • ConcreteDecorator:具体装饰类
结构图:
如何理解这6种常见设计模式?
本文插图
时序图:
如何理解这6种常见设计模式?
本文插图
优缺点
  • 优点:比继承更加灵活(继承是耦合度很大的静态关系) , 可以动态的为对象增加职责 , 可以通过使用不同的装饰器组合为对象扩展N个新功能 , 而不会影响到对象本身 。
  • 缺点:当一个对象的装饰器过多时 , 会产生很多的装饰类小对象和装饰组合策略 , 增加系统复杂度 , 增加代码的阅读理解成本 。
适用场景
  • 适合需要(通过配置 , 如:diamond)来动态增减对象功能的场景 。
  • 适合一个对象需要N种功能排列组合的场景(如果用继承 , 会使子类数量爆炸式增长)
注意事项
  • 一个装饰类的接口必须与被装饰类的接口保持相同 , 对于客户端来说无论是装饰之前的对象还是装饰之后的对象都可以一致对待 。
  • 尽量保持具体构件类Component作为一个“轻”类 , 也就是说不要把太多的逻辑和状态放在具体构件类中 , 可以通过装饰类 。
简单实现
package decorator; public class DecoratorPattern { public static void main(String[] args) { Component component = new ConcreteComponent(); component.operation(); System.out.println(''---------------------------------''); Component decorator = new ConcreteDecorator(component); decorator.operation(); } } //抽象构件角色 interfaceComponent { public void operation(); } //具体构件角色 class ConcreteComponent implements Component { public ConcreteComponent() { System.out.println(''创建具体构件角色''); } public void operation() { System.out.println(''调用具体构件角色的方法operation()''); } } //抽象装饰角色 class Decorator implements Component { private Component component; public Decorator(Component component) { this.component=component; } public void operation() { component.operation(); } } //具体装饰角色 class ConcreteDecorator extends Decorator { public ConcreteDecorator(Component component) { super(component); } public void operation() { super.operation(); addBehavior(); } public void addBehavior() { System.out.println(''为具体构件角色增加额外的功能addBehavior()''); } }4 策略模式(Strategy)
男生追妹子时 , 一般都会用到这种模式 , 常见的策略有这些:约会吃饭;看电影;看演唱会;逛街;去旅行…… , 虽然做的事情不同 , 但可以相互替换 , 唯一的目标都是捕获妹子的芳心 。
策略模式结构
  • Context: 环境类
  • Strategy: 抽象策略类
  • ConcreteStrategy: 具体策略类
结构图:
如何理解这6种常见设计模式?
本文插图
时序图:
如何理解这6种常见设计模式?
本文插图
优缺点