1.概念
定义一系列算法的方法,所有这些算法完成的都是相同的工作但实现不同
2.实现步骤
- 定义抽象策略类,同时定义算法
- 定义具体抽象类,用于实现定义的算法
- 定义context类,用于算法统一调用
- 定义工厂类,利用反射根据传入对象不同从而完成不同方法调用
3.案例
- 定义抽象策略类
public interface AlgorithmStrategy {
void algorithm();
}
- 定义具体抽象类,同时实现定义的算法
// A策略
public class AStrategy implements AlgorithmStrategy{
@Override
public void algorithm() {
System.out.println("A算法计算公式");
}
}
// B策略
public class BStrategy implements AlgorithmStrategy {
@Override
public void algorithm() {
System.out.println("B算法计算公式");
}
}
- 定义策略上下文,实现算法同一处理
public class StrategyContext {
private AlgorithmStrategy strategy;
public StrategyContext(AlgorithmStrategy strategy) {
this.strategy = strategy;
}
public void calculat() {
this.strategy.algorithm();
}
}
- 定义策略工厂类,动态获得具体策略
public class StrategyFactory {
public static AlgorithmStrategy getStrategy(String className) throws Exception {
Class<?> aClass = Class.forName(className);
AlgorithmStrategy algorithmStrategy = (AlgorithmStrategy) aClass.newInstance();
return algorithmStrategy;
}
}
- 测试使用
public class MainTest {
public static void main(String[] args) throws Exception {
//不使用策略工厂
StrategyContent ca = new StrategyContent(new AStrategy());
ca.calculat();
StrategyContent cb = new StrategyContent(new BStrategy());
cb.calculat();
//使用工厂模式加反射实现
AlgorithmStrategy strategyA = StrategyFactory
.getStrategy("com.xiaofengczy.design.structural.strategy.demo01.AStrategy");
strategyA.algorithm();
AlgorithmStrategy strategyB = StrategyFactory
.getStrategy("com.xiaofengczy.design.structural.strategy.demo01.BStrategy");
strategyB.algorithm();
}
}
- 案例结构图