装饰器模式和策略模式

892 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

装饰器模式

动态地给一个对象添加一些额外的职责,此模式属于结构性模式,它作用是对对象已有功能进行增强,但是不改变原有对象结构。

image.png

装饰器的优缺点

装饰器和模板方法、策略模式的比较

装饰器保持对象的功能不变,扩展外围功能 模板方法和策略模式则保持算法的框架不变,扩展其内部的实现

  • 装饰器和继承的比较 *

扩展对象的功能 装饰器是动态,继承是静态的 装饰器可任意组合,但也可使其更复杂

装饰器的应用场景

  • Servlet中的应用 HttpServletRequest/HttpServletRequestWrapper
  • 同步化装饰器 Collections.synchronizedList(list)
  • Java I/O流核心类库 InputSteam,OutputSteam Reader,Writer
  • Spring的源码
  • Tomcat DBCP源码

策略Strategy模式

定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。

image.png

其中,Context是上下文,用一个ConcreteStrategy来配置,维护一个对Strategy对象的引用;Strategy是策略类,用于定义所有支持算法的公共接口;ConcreteStrategy是具体策略类,封装了具体的算法或行为,继承于Strategy。

应用场景:

if(){} 

else if(){} 

if(){} …

使用起来有三个原则:

  • 封装变化;
  • 多用组合,少用继承;
  • 针对接口编程,不针对实现编程。