设计模式是一套被在实际使用中,总结出来的一些代码设计经验的总结,学习设计模式有助于理解框架的结构。成熟的框架通常使用了多种设计模式,如果你熟悉这些设计模式,毫无疑问,对于快速掌握框架的结构有很大的帮助。
主要功能
如其名,主要功能就是装饰,就是够在不改变原类文件、和不使用继承的情况下,动态扩展一个对象的功能和职责。装饰模式是通过将真实的对象包裹起来,然后对其进行装饰,并一层一层的传递下去,逐层装饰,直到装饰完成。
简单的说就是,在不违背开放-封闭原则的情况下,动态为一个对象增加一系列功能和职责
UML类图结构
装饰模式的UML的类图结构装饰模式中的角色
- 抽象构件角色(Component): 一个抽象的接口,用来规范被装饰对象。
- 具体构造角色(ConcreteComponent ):业务场景比较简单,Component和ConcreteComponent的角色可以合并成一个
- 装饰角色(Decoretor):持有一个抽象构件角色的引用,并通过构造方法或者set方法,对其赋值
- 具体的装饰角色(ConcreteDecoretor): 业务场景比较简单时,ConcreteDecoretor和Decoretor两个的角色可以合并为一个
对模式的理解
装饰角色持有一个被装饰对象的引用,在转发请求前后增加附加的功能,实现对被装饰对象功能的扩展,并将当前装饰角色再依次传递给下一个具体的装饰角色,完成一系列的装饰,达到最终的效果
关键字
动态扩展 、 依次传递
-
因为需要对"你"进行
动态扩展
,不能使用继承(继承是属于静态行为,无法做到动态改变,同时继承会违反开闭原则),所以装饰角色需要持有一个被装饰对象的引用,可以通过set方法、构造方法对其初始化和对象的传递
。 -
装饰角色为什么需要实现和被装饰对象相同的接口,因为需要
依次传递
到不同的具体装饰角色中,方法参数类型必须一致特点
-
装饰模式的对装饰顺序敏感
-
装饰模式构造过程相比于建造者模式是不稳定的
-
可以分离对象的核心职责与装饰功能
-
更容易利用功能,把复杂的功能分散到每一个装饰器中,有利于利用利用,同样也会产生很多细粒度的对象
应用场景
- 装饰模式在JAVA中最典型的应用应该就是I/O流了
- 通过装饰模式实现消息的加密解密
- 通过装饰模式实现类似AOP的功能
- 其它场景
网友评论