1.策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
- 策略模式结构图
2.策略模式解析
- 策略模式是一种定义一系列算法的方法。这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
- 策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能
- 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。
3.个人理解
- 策略模式是将一个公共的功能或者方法封装在一个接口interface Strategy或者是abstract class Strategy当中;
- 具体类继承Strategy,重写方法来实现具体的实现方式;
- Context类是用来承载上下文,初始化时传入具体的策略对象;并有一个上下文接口方法,用于调用算法。
4.代码实现
- 抽象策略角色类
public abstract class AbstractStrategy {
public abstract int caculate(int a, int b);
}
或者
/**
*
* @author yifei
* 定义了一个总的接口,实现了一个方法
*
*/
public interface InterfaceStrategy {
public int caculate(int a, int b);
}
- 具体策略角色类
public class AddStrategy implements InterfaceStrategy {
@Override
public int caculate(int a, int b) {
// TODO Auto-generated method stub
int c = a + b;
return c;
}
}
public class SubStrategy implements InterfaceStrategy {
@Override
public int caculate(int a, int b) {
// TODO Auto-generated method stub
int c = a - b;
return c;
}
}
public class MultStrategy implements InterfaceStrategy {
@Override
public int caculate(int a, int b) {
// TODO Auto-generated method stub
int c = a * b;
return c;
}
}
public class DivStrategy implements InterfaceStrategy {
@Override
public int caculate(int a, int b) {
// TODO Auto-generated method stub
int c = 0;
if(b != 0) {
c = a / b;
}
return c;
}
}
- 环境角色类
public class StrategyContext {
private InterfaceStrategy strategy;
public StrategyContext(InterfaceStrategy strategy) {
this.strategy = strategy;
}
public int getResult(int a, int b) {
return strategy.caculate(a, b);
}
}
- 客户端调用
public class Main {
public static void main(String[] args) {
StrategyContext strategyContext = null;
int a = 1;
int b = 2;
strategyContext = new StrategyContext(new AddStrategy());
System.out.println(strategyContext.getResult(a, b));
strategyContext = new StrategyContext(new SubStrategy());
System.out.println(strategyContext.getResult(a, b));
strategyContext = new StrategyContext(new MultStrategy());
System.out.println(strategyContext.getResult(a, b));
strategyContext = new StrategyContext(new DivStrategy());
System.out.println(strategyContext.getResult(a, b));
}
}