- 策略模式是一种行为型模式,允许用户通过从一组提供的备选方案中选择实现该行为的算法,或提供一个新的实现,来自定义类行为的某个特定方面。
- 传统的面向对象策略模式在运行时应用,而C++将泛型编程与策略模式结合,形成一种称为基于策略的设计技术。这种方法中,主类模板将某些行为委托给用户指定的策略类型。
- 一般来说,对策略类型几乎没有限制,尽管其声明和使用方式在约定上施加了某些限制。如果策略当作函数调用,则可调用类型都可以使用。另一方面,如果调用了策略的特定成员函数,则该策略必须是类并提供所需的成员函数。模板策略也可以使用,但必须与指定的模板参数数量完全匹配。
- 主要有两种方式:组合和继承。通常应优先选择组合;实践中许多策略是没有数据成员的空类,可以通过空基类优化受益。应优先使用私有继承,除非策略还需要修改主类的公共接口。需要操作主策略类本身的策略,通常要使用CRTP(奇异递归模板模式)。其他情况下,当策略对象本身不依赖于主模板构造中使用的类型时,策略行为可以通过静态成员函数暴露。
- 一般规则是,仅包含常量并用于约束公共接口的策略更容易编写和维护。某些情况下,通过基类策略注入公共成员函数是首选:当需要向类中添加成员变量时,或者当维护完整的公共函数集很困难或会导致冲突时。
- 主要缺点是复杂性,表现为多种形式。具有不同策略的策略型类型通常是不同的类型(唯一的替代方案是类型擦除,但通常会带来不可接受的运行时开销)。这可能迫使代码的大部分也必须模板化。长策略列表难以维护和正确使用。所以应谨慎避免创建不必要的,或难以证明合理的策略。有时,具有两组足够不相关的策略的类型,最好拆分为两个独立的类型。