策略模式
定义
策略模式(Strategy Pattern)也称为(Policy Parttern)。
定义一组算法,将每个算法都封装起来,并且使他们之间可以互换
优缺点、应用场景
优点
- 算法可以自由切换。这是策略模式本身的定义,只要实现抽象策略就可以作为一个“策略”
- 避免使用多重条件判断。可以减少if-else的使用
- 拓展性良好。
缺点
- 策略类数量增多,且可复用性小
- 所有策略都要对外暴露。上层模块必须知道有哪些策略,然后才能决定使用,幸运的是可以使用其他模式来修正这个缺陷,如:工厂方法模式、代理模式、享元模式
使用场景
- 多个类只有在算法和行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
代码模拟场景
《三国演义》中刘备前往东吴联姻,诸葛亮派子龙随从,担心主公有失,便给子龙三道锦囊,在紧急时候依次打开
策略模式
- 策略模式有两个角色:抽象策略角色(Strategy)和上下文角色(Context)
- 抽象策略角色负责管理具体的策略
- 上下文对象负责管理抽象策略,屏蔽高层模块对策略、算法的直接访问
UML图
抽象策略角色与实现类
/**
* 策略接口
*/
public interface IStrategy {
// 每个策略必有一个执行的方法
public void operate();
}
/**
* 找乔国老开后门
*/
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
}
}
/**
* 吴国太开绿灯
*/
public class GivenGreenLight implements IStrategy {
@Override
public void operate() {
System.out.println("求吴国太开绿灯,放行");
}
}
/**
* 孙夫人断后
*/
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
上下文角色
/**
* 锦囊
*/
public class Context {
private IStrategy strategy;
// 构造函数,需要使用哪个策略
public Context(IStrategy strategy){
this.strategy = strategy;
}
// 使用策略
public void operate(){
this.strategy.operate();
}
}
入口类
public class ZhaoYun {
public static void main(String[] args) {
Context context;
// 刚到吴国时拆第一个
System.out.println("-----初到吴国启用第一个策略-----");
context = new Context(new BackDoor());
context.operate();
// 刘备乐不思蜀时
System.out.println("-----刘备乐不思蜀启用第二个策略-----");
context = new Context(new GivenGreenLight());
context.operate();
// 孙权追兵赶来
System.out.println("-----孙权追兵赶来启用第三个策略-----");
context = new Context(new BlockEnemy());
context.operate();
}
}
结果
策略模式(策略枚举)
- 将策略方法结合枚举final + static 的特点,可以用于变动率不高的策略的场景
- 策略枚举的逻辑更加贴近现实世界的逻辑
策略枚举
枚举类
/**
* 策略枚举
*/
public enum Calculator {
// 加法运算
ADD("+") {
public int exec(int a,int b){
return a+b;
}
},
// 减法运算
SUB("-"){
@Override
public int exec(int a, int b) {
return a-b;
}
};
String value = "";
// 定义成员值类型
private Calculator(String Value) {
this.value = value;
}
// 获得枚举成员的值
public String getValue(){
return this.value;
}
// 声明一个抽象函数
public abstract int exec(int a ,int b);
}
入口类
/**
* 策略枚举入口类
*/
public class StrategyEnumMain {
public static void main(String[] args) {
int a = Integer.parseInt(args[0]);
String symbol = args[1];
int b = Integer.parseInt(args[2]);
System.out.println("输入的参数为:" + Arrays.toString(args));
System.out.println("运行结果为:" + a+symbol+b + "=" + Calculator.ADD.exec(a,b));
}
}
结果
参考书籍
秦小波《设计模式之禅》
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 【AI新趋势期刊#1】GPT自动理解视频、AI法律顾问、大模型安全围栏
每天都要浏览大量AI相关新闻,是不是感到信息量爆炸,有效信息少? 这么多新产品和新工具,到底哪些是真正是有价值的,哪些只是浮躁的一时热点? 想参与AI产品和工具的开发,从哪里能够获得大量的灵感和思路? 我会把AI相关的新趋势、新想法、新思路,和成熟AI产品、工…