设计模式-装饰模式

设计模式是一套被在实际使用中,总结出来的一些代码设计经验的总结,学习设计模式有助于理解框架的结构。成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,对于快速掌握框架的结构有很大的帮助。

主要功能

​ 如其名,主要功能就是装饰,就是够在不改变原类文件、和不使用继承的情况下,动态扩展一个对象的功能和职责。装饰模式是通过将真实的对象包裹起来,然后对其进行装饰,并一层一层的传递下去,逐层装饰,直到装饰完成。

简单的说就是,在不违背开放-封闭原则的情况下,动态为一个对象增加一系列功能和职责

UML类图结构

装饰模式的UML的类图结构

装饰模式中的角色

  • 抽象构件角色(Component): 一个抽象的接口,用来规范被装饰对象。
  • 具体构造角色(ConcreteComponent ):业务场景比较简单,Component和ConcreteComponent的角色可以合并成一个
  • 装饰角色(Decoretor):持有一个抽象构件角色的引用,并通过构造方法或者set方法,对其赋值
  • 具体的装饰角色(ConcreteDecoretor): 业务场景比较简单时,ConcreteDecoretor和Decoretor两个的角色可以合并为一个

对模式的理解

装饰角色持有一个被装饰对象的引用,在转发请求前后增加附加的功能,实现对被装饰对象功能的扩展,并将当前装饰角色再依次传递给下一个具体的装饰角色,完成一系列的装饰,达到最终的效果

关键字

动态扩展依次传递

  • 因为需要对"你"进行动态扩展,不能使用继承(继承是属于静态行为,无法做到动态改变,同时继承会违反开闭原则),所以装饰角色需要持有一个被装饰对象的引用,可以通过set方法构造方法对其初始化和对象的传递

  • 装饰角色为什么需要实现和被装饰对象相同的接口,因为需要依次传递到不同的具体装饰角色中,方法参数类型必须一致

    特点

  • 装饰模式的对装饰顺序敏感

  • 装饰模式构造过程相比于建造者模式是不稳定的

  • 可以分离对象的核心职责与装饰功能

  • 更容易利用功能,把复杂的功能分散到每一个装饰器中,有利于利用利用,同样也会产生很多细粒度的对象

应用场景

  • ​ 装饰模式在JAVA中最典型的应用应该就是I/O流了
  • ​ 通过装饰模式实现消息的加密解密
  • ​ 通过装饰模式实现类似AOP的功能
  • ​ 其它场景

你可能感兴趣的:(设计模式-装饰模式)