策略模式(Strategy): 它定义了算法家族,分别封装起来,让他们指尖可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
应用实例: 1、商场的促销方案,每种促销手段就是一种策略 2、旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。
策略模式UML类图如下:
代码示例:
//Context类
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy(int num1, int num2) {
strategy.doOperation(num1, num2);
}
}
//策略类
public abstract class Strategy {
public abstract void doOperation(int num1, int num2);
}
//具体的实体子类
public class StrategyAdd extends Strategy {
@Override
public void doOperation(int num1, int num2) {
System.out.println("result = " + (num1 + num2));
}
}
public class StrategyMultiply extends Strategy {
@Override
public void doOperation(int num1, int num2) {
System.out.println("result = " + (num1 * num2));
}
}
public class StrategySub extends Strategy {
@Override
public void doOperation(int num1, int num2) {
System.out.println("result = " + (num1 - num2));
}
}
//实际使用
public class StrategyDemo {
public static void main(String[] args) {
Context context;
context = new Context(new StrategyAdd());
context.executeStrategy(10, 5);
context = new Context(new StrategySub());
context.executeStrategy(10, 5);
context = new Context(new StrategyMultiply());
context.executeStrategy(10, 5);
}
}
其实感觉策略模式和简单工厂模式很相似,可以结合一下:
//将Context简单修改下,外部传入类型,然后根据不同的类型创建不同的策略对象
public class Context {
private Strategy strategy;
public Context(String type) {
switch (type) {
case "add":
strategy = new StrategyAdd();
break;
case "sub":
strategy = new StrategySub();
break;
case "multiply":
strategy = new StrategyMultiply();
break;
}
}
public void executeStrategy(int num1, int num2) {
if (strategy != null) {
strategy.doOperation(num1, num2);
}
}
}