跳到主要内容

14 策略模式(Stratery Method Design Pattern)

策略模式是一种行为设计模式,使用时定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。

和模版方法设计模式不同的是,模版方法定义的是算法的基本流程,并将可变部分交由子类实现。策略模式实现的是可插拔式的调用。

  • 策略模式强调“算法的互换与组合”;
  • 模板方法强调“流程的固定与步骤的扩展”。

使用场景

  1. 支付系统:不同支付渠道(支付宝、微信、数字货币)的接入;
  2. 数据校验:针对不同数据源(数据库、API、文件)的校验规则;
  3. 缓存策略:LRU、LFU、FIFO等算法的动态选择。

1. 应用

1.1 优点

  1. 灵活易于扩展,不用修改原有代码;
  2. 客户端调用可以动态切换。

1.2 缺点

  1. 维护成本增大;
  2. 客户端在调用时需要知道有哪些策略类。

2. 实现分析

2.1 策略模式通常包含下面几种角色

  1. Context(上下文):上下文类负责维护对策略对象的引用,并在运行时切换策略。上下文类通常具有一个方法,用于执行当前策略;
  2. Strategy(策略):策略是一个接口或抽象类,定义了一组算法的共同接口。具体的策略类实现这个接口,提供了不同的算法实现;
  3. ConcreteStrategy(具体策略):具体策略类实现了策略接口,提供了特定算法的实现。

因此策略模式的使用方式为:

  1. 定义策略接口:创建一个策略接口或抽象类,定义算法的方法;
  2. 创建具体策略类:为每个算法创建具体的策略类,这些类应该实现策略接口,并提供自己的算法实现;
  3. 创建上下文类:上下文类应该包含一个策略对象的引用,并提供方法来设置和执行策略;
  4. 在客户端代码中使用:在客户端代码中创建上下文对象,并根据需要设置不同的策略。

用支付举个例子:常见的支付有支付宝,微信等,在支付时,用户可以根据他们的喜好来进行支付。这时候就需要动态的选择支付策略。