基本概念
策略模式 Strategy Pattern 属于行为型设计模式,将调用算法和算法本身分离解耦,让一个类的行为或者算法可以运行的时候更改。具体的使用类只需要组合算法的接口,算法的具体实现留给子类实现,然后具体使用哪种算法可以动态的指定。
UML
角色分析
Context 上下文对象 算法具体的使用者 组合算法接口
StrategyA StrategyB 不同的算法接口
ConcreteStrategXXX 具体的算法实现
代码实现
有一个传入2个数根据传入的加减乘除的策略不同进行不同的运算
// 一个抽象策略接口
public interface Strategy {
// 策略下的操作
int operation(int a, int b);
}
// 加法策略
public class AddStrategy implements Strategy {
@Override
public int operation(int a, int b) {
return a + b;
}
}
// 减法策略
public class SubStrategy implements Strategy {
@Override
public int operation(int a, int b) {
return a - b;
}
}
// 乘法策略
public class MultipleStrategy implements Strategy {
@Override
public int operation(int a, int b) {
return a * b;
}
}
// context 上下文类 核心类
public class BiNumberOperation {
// 组合不同的策略
Strategy strategy;
public BiNumberOperation(Strategy strategy) {
this.strategy = strategy;
}
//可以动态设置策略
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public Strategy getStrategy() {
return strategy;
}
public int operation(int a, int b) {
// 使用算法策略下面具体的操作
if (strategy != null) {
return strategy.operation(a, b);
}
return 0;
}
}
// 测试类
public class StrategyTest {
public static void main(String[] args) {
BiNumberOperation biNumberOperation = new BiNumberOperation(new AddStrategy());
int addStrategy = biNumberOperation.operation(1, 2);
System.out.println(addStrategy);
System.out.println("===========================================");
biNumberOperation.setStrategy(new SubStrategy());
int subStrategy = biNumberOperation.operation(1, 2);
System.out.println(subStrategy);
System.out.println("===========================================");
biNumberOperation.setStrategy(new MultipleStrategy());
int multipleStrategy = biNumberOperation.operation(1, 2);
System.out.println(multipleStrategy);
}
}
使用细节
- 策略模式核心需要分析中类或者项目中的抽象行为将变化和不变部分分离
- 核心思想是多用组合聚合 少用继承的行为
- 将算法独立封装在Strategy中,独立于Context,根据不同的情况可以动态切换不同的策略
- 缺点在于如果策略变化过多会有许多策略类增加系统维护成本