CHAPTER 11(下) 面向可复用性和可维护性的设计模式
11.3 行为模式
11.3.1 Strategy
11.3.1.1 应用环境
--算法整体替换
--理解:当某个方法需要在多个版本间更替
--调用时委托,动态传入客户端倾向的算法类实例,类似于python将函数作为参数传递
--用户类直接在方法里传一下Strategy接口即可,类之间耦合很松散
11.3.1.2 优势
11.3.1.3 劣势
\
11.3.2 模板模式 Template Method
11.3.2.1 应用场景
--区别于策略模式调用单个方法,模板模式涉及多个方法的选择与切换。这里介绍的模板模式是根据用户的不同而编写不同的模板实现类,将产生差异的方法写死进实现类里。如果结合策略模式,在模板类(抽象)里传入每一个不同方法集合的接口,则可产生更多变化,更加类似于装饰器。
--在父类声明通用逻辑,采用继承 + Override实现算法不同部分。区别于策略模式:采用委托实现算法调用(接口 + 多态)。
--在框架中应用广泛,用于实现算法不变性,并由客户端提供每一步的具体实现。
11.3.3 迭代器模式 Iterator
--模式归纳如下:
--抽象迭代器类定义遍历协议。
--每个聚合类的具体迭代器子类。
--聚合实例创建迭代器对象的实例。
--聚合实例保留对迭代器对象的引用。
11.3.3.1 Iterator接口
--要求实现该接口的集合对象可迭代。
--该接口要求自己的集合类实现接口(实现迭代器Iterator)以进行显示或隐式的迭代遍历。
11.3.4 访问者模式 Visitor
11.3.4.1 应用场景
--为ADT预留一个类似于接口的可扩展功能的方法,可通过委托等机制,在将来不改变ADT内部代码的情况下得到新的功能组合。
--有点像策略模式(?
--功能类构造比较常规,接口声明用于接收外界Visitor接口的实现类的方法,但visitor接口内对于功能接口的不同实现类多态地声明了多个visit函数。
//了解对象数组的这种声明方式
11.3.4.2 行为模式比较
-- Visitor vs Iterator
--迭代器以遍历的方式访问集合数据,而无需暴露其内部表示,将“遍历”这项功能delegate到外部的iterator对象。
--观察者模式在特定ADT上执行某种特定操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT,维护了OCT。
-- Strategy vs visitor
--都通过委托建立功能对象与ADT的动态联系
--Visitor强调ADT内部不变性,通过外部定义,对ADT执行某项操作,客户端把visitor作为功能对象,将它传入ADT,利用其内部功能方法的多态性对不同实现的ADT执行操作。
--Strategy强调ADT内部对某些待实现功能的相应算法的灵活替换。这些算法被ADT委托到外部的Strategy类上。
--按照PPT总结:visitor是站在外部client的角度,灵活增加对ADT的各种不同操作,strategy则是站在内部ADT的角度,灵活变化对其内部功能的不同配置。