前言
策略模式是行为型设计模式的一种,关于策略模式的分析将分为几篇博文,分别从策略模式结构,策略模式优化,策略模式在业务场景中的应用、策略模式在spring中优雅使用等几个方面分析。
什么是策略模式
策略 模式 是一种行为设计模式 , 它能让你定义一系列算法 , 并将每种算法分别放入独立的类中 , 以使算法的对象能够相互替换 。
策略模式结构
策略模式的结构如下:
- StrategyContext :策略上下文对象,维护指向具体策略的引用,通过策略接口Strategy与对象进行沟通。
- Strategy :策略接口,定义统一的策略入口方法,留给具体策略类实现,且供StrategyContext调用。
- AStrategy (BStrategy、CStrategy):具体的策略类,实现Strategy,提供各种不同的算法。
- Client :调用方,指需要用的策略算法的地方。
策略模式伪代码
结合上面的类图,用伪代码来表示
策略接口定义
package com.lsz.order.strategy;
/**
* 策略接口定义
*
* @author lishuzhen
* @createTime 2022年05月11日 22:48:00
*/
public interface Strategy {
/**
* 策略算法执行入口
*
* @param obj
* @return
*/
Object execute(Object obj);
}
ABC三个策略的实现
/**
* A策略
*
* @author lishuzhen
* @createTime 2022年05月11日 22:49:00
*/
public class AStrategy implements Strategy {
/**
* 策略算法执行入口
*
* @param obj
* @return
*/
@Override
public Object execute(Object obj) {
return null;
}
}
/**
* B策略
*
* @author lishuzhen
* @createTime 2022年05月11日 22:49:00
*/
public class BStrategy implements Strategy {
/**
* 策略算法执行入口
*
* @param obj
* @return
*/
@Override
public Object execute(Object obj) {
return null;
}
}
/**
* C策略
*
* @author lishuzhen
* @createTime 2022年05月11日 22:50:00
*/
public class CStrategy implements Strategy {
/**
* 策略算法执行入口
*
* @param obj
* @return
*/
@Override
public Object execute(Object obj) {
return null;
}
}
策略上下文对象
package com.lsz.order.strategy;
/**
* 策略上下文对象
*
* @author lishuzhen
* @createTime 2022年05月11日 22:48:00
*/
public class StrategyContext {
private Strategy strategy;
/**
* 策略上下文对象委派具体的策略执行算法
*
* @param obj
* @return
*/
public Object handler(Object obj) {
return strategy.execute(obj);
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
调用方
package com.lsz.order.strategy;
/**
* @author lishuzhen
* @createTime 2022年05月11日 22:50:00
*/
public class Client {
public static void main(String[] args) {
// 模拟业务参数
String parameter = "A";
Object obj = new Object();
// 策略上下文对象
StrategyContext context = new StrategyContext();
switch (parameter) {
case "A":
// 执行使用A策略
context.setStrategy(new AStrategy());
context.handler(obj);
break;
case "B":
// 执行使用B策略
context.setStrategy(new BStrategy());
context.handler(obj);
break;
case "C":
// 执行使用C策略
context.setStrategy(new CStrategy());
context.handler(obj);
break;
default:
throw new RuntimeException("Not Found Strategy");
}
}
}
策略模式优点
- 可以在程序运行时切换不同的策略。
- 调用方和算法具体实现代码隔离分开。
- 符合开闭原则,无需修改策略上下文对象就能够引入新的策略。
策略模式缺点
- 由上面Client代码可见,调用方依赖具体策略类,且需要自己选择合适的策略。PS:对于这一点后面再写博文提出优化方案。
- 如果业务逻辑不是很复杂,强行使用策略模式会增加程序的复杂度。