14 策略模式(Stratery Method Design Pattern)
策略模式是一种行为设计模式,使用时定义一系列算法,并将每种算法分别放入独立的类中,以使算法的对象能够相互替换。
和模版方法设计模式不同的是,模版方法定义的是算法的基本流程,并将可变部分交由子类实现。策略模式实现的是可插拔式的调用。
- 策略模式强调“算法的互换与组合”;
- 模板方法强调“流程的固定与步骤的扩展”。
使用场景
- 支付系统:不同支付渠道(支付宝、微信、数字货币)的接入;
- 数据校验:针对不同数据源(数据库、API、文件)的校验规则;
- 缓存策略:LRU、LFU、FIFO等算法的动态选择。
1. 应用
1.1 优点
- 灵活易于扩展,不用修改原有代码;
- 客户端调用可以动态切换。
1.2 缺点
- 维护成本增大;
- 客户端在调用时需要知道有哪些策略类。
2. 实现分析
2.1 策略模式通常包含下面几种角色
- Context(上下文):上下文类负责维护对策略对象的引用,并在运行时切换策略。上下文类通常具有一个方法,用于执行当前策略;
- Strategy(策略):策略是一个接口或抽象类,定义了一组算法的共同接口。具体的策略类实现这个接口,提供了不同的算法实现;
- ConcreteStrategy(具体策略):具体策略类实现了策略接口,提供了特定算法的实现。
因此策略模式的使用方式为:
- 定义策略接口:创建一个策略接口或抽象类,定义算法的方法;
- 创建具体策略类:为每个算法创建具体的策略类,这些类应该实现策略接口,并提供自己的算法实现;
- 创建上下文类:上下文类应该包含一个策略对象的引用,并提供方法来设置和执行策略;
- 在客户端代码中使用:在客户端代码中创建上下文对象,并根据需要设置不同的策略。
用支付举个例子:常见的支付有支付宝,微信等,在支付时,用户可以根据他们的喜好来进行支付。这时候就需要动态的选择支付策略。