首页 > 代码库 > 设计模式之策略模式

设计模式之策略模式

策略模式将可变的部分从程序抽象分离成算法接口,在该接口下分别封装一系列算法实现。这样不同的算法之间可以互相替换,使客户端可以独立这些算法。

根据面向对象的编程思想,我们通常会采用以下方式解决问题。

  1. 继承父类

    优点:相同场景下代码复用率高

    缺点:容易忘记代码的复写,不灵活,不同场景下代码复用率低

  2. 抽象

    优点:由子类覆写父类的抽象方法,比较灵活

    缺点:代码复用率低

  3. 组合

"组合优先于继承"。在类中增加一个私有域,引用另一个已有类的实例,通过调用引用实例的方法获得新的功能,这种设计成为组合。

优点:代码复用率高,易于维护;架构灵活;富有弹性,可以较好适应变化,"开闭原则";消除大量条件语句;

缺点:在客户端程序中需要注入一个具体的strategy算法实现类,客户代码需要了解每一个策略实现的细节;增加了对象的数目。

策略模式的设计原则

  • 我们找出需求中需要变化的部分,将它们独立出来,而不是与其他代码混合在一起。
  • 面向接口,而不是面向实现编程。通过多态的方式,来适配不同的处理方式。
  • 多用组合,少用继承。

策略模式实现步骤

  • 通过分离变化得到策略接口strategy
  • 为策略接口提供实现类
  • 客户端程序持有该策略接口
  • 在客户端程序中正确选择并组装调用strategy的实现类

使用场景

  • 许多相关的类仅仅是行为差异
  • 运行时选择不同的算法变体
  • 通过条件语句在多个分支中取其一

设计模式之策略模式