策略模式 (也叫做政策模式):定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。使用策略模式后,可以由其他模块决定采用何种策略,策略家族对外提供的访问接口就是封装类,简化了操作,同时避免了条件语句判断。平时使用时,一般用工厂方法模式来实现策略类的声明。
通用类图
通用示例
/**
* 策略接口类
*/
public interface IStrategy {
public int deal(Integer a, Integer b);
}
/**
* 减法策略
*/
public class SubStrategy implements IStrategy {
@Override
public int deal(Integer a, Integer b) {
return a - b;
}
}
/**
* 加法策略
*/
public class AddStrategy implements IStrategy {
@Override
public int deal(Integer a, Integer b) {
return a + b;
}
}
/**
* 策略执行者
*/
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy) { this.strategy = strategy;}
public Integer exec(Integer a, Integer b) {
return strategy == null ? null : strategy.deal(a, b);
}
}
public class StrategyClient {
public static void main(String[] args) {
IStrategy strategy = null;
String operateType = "add";
if ("add".equals(operateType)) {
System.out.println("operate = add");
strategy = new AddStrategy();
} else if ("sub".equals(operateType)) {
System.out.println("operate = sub");
strategy = new SubStrategy();
} else {
System.out.println("operate not verify");
}
Context context = new Context(strategy);
Integer result = context.exec(12, 4);
System.out.println("result = " + result);
}
}
/************ 打印结果: *****************/
operate = add
result = 16
枚举策略
public enum CalculateEnum {
ADD("+") {
public int exec(int a, int b) {
return a + b;
}
},
SUB("-") {
public int exec(int a, int b) {
return a - b;
}
};
private String value;
public String getValue() {
return this.value;
}
CalculateEnum(String value) {
this.value = value;
}
public abstract int exec(int a, int b);
}
public class CalculateClient {
public static void main(String[] args) {
String operateType = "+";
if (operateType.equals(CalculateEnum.ADD.getValue())) {
System.out.println("operateType = " + CalculateEnum.ADD.toString());
System.out.println("CalculateEnum.ADD.exec = " + CalculateEnum.ADD.exec(12, 13));
} else if (operateType.equals(CalculateEnum.SUB.getValue())) {
System.out.println("operateType = " + CalculateEnum.SUB.toString());
System.out.println("CalculateEnum.SUB.exec = " + CalculateEnum.SUB.exec(12, 13));
} else {
System.out.println("operateType not verify");
}
}
}
/************ 打印结果: *****************/
operateType = ADD
CalculateEnum.ADD.exec = 25