设计模式-策略模式
# 设计模式-策略模式
# 概述
在生活中你去某一个地方旅游,那么出行的方式就有多种:火车、汽车、飞机等。那么我们就会根据时间、金钱、距离等多种现实因素去衡量采取哪种策略是性价比最高的。
# 定义
策略模式实现了算法定义和算法使用的分离,它通过继承和多态机制实现对算法族的使用和管理,是一个简单、实用的设计模式
策略模式: 定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户而变化。
# 策略模式结构
策略模式涉及到三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
# 策略模式案例
1、创建抽象策略类
public interface Strategy {
int doOperation(int num1, int num2);
}
2、创建具体策略类
// 加法策略类
public class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
// 乘法策略类
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return 0;
}
}
// 减法策略类
public class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
3、创建环境
public class Context {
private final Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
4、案例实现
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
# 策略模式优缺点
优点:
算法可以自由切换。
避免使用多重条件判断。
扩展性良好。
缺点:
- 客户端必须知道所有的策略类,并自行决定实用哪一个策略类。
- 策略模式将造成系统产生很多具体策略类。
- 无法同时在客户端使用多个策略类。
# 策略模式适用环境
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一种。
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
# 参考
Java设计模式
上次更新: 2024/06/29, 15:13:44