一 概述
目的:针对不同的场景,使用不同的策略解决问题;
原则:不破坏原有的类,通过扩展原有类来达到扩展功能的目的;
二 使用示例
构造策略接口、策略接口实现加法类、策略接口实现减法类;
package cn.http.test;
/**
* 策略
*
* @author:wjm
* @date:2020/6/16 18:26
*/
public interface Strategy {
/**
* 计算器
*
* @param a 操作数
* @param b 被操作数
* @return
*/
int calculate(int a, int b);
}
package cn.http.test;
/**
* 策略:加法运算
*
* @author:wjm
* @date:2020/6/16 18:26
*/
public class Addition implements Strategy {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
package cn.http.test;
/**
* 策略:减法运算
*
* @author:wjm
* @date:2020/6/16 18:26
*/
public class Subtraction implements Strategy {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
package cn.http.test;
/**
* 计算器(策略的使用者)
*
* @author:wjm
* @date:2020/6/16 18:26
*/
public class Calculator {
private Strategy strategy;
/**
* 使用时需注入实现了策略接口的具体运算类
*
* @param strategy
*/
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int getResult(int a, int b) {
return this.strategy.calculate(a, b);
}
}
策略使用:
package cn.http.test;
/**
* 策略模式应用
*
* @author:wjm
* @date:2020/6/16 18:26
*/
public class Test {
public static void main(String[] args) {
//绑定策略的使用者,通过策略的使用者使用策略
//注入加法运算策略实现类,实现加法运算
Calculator calculator = new Calculator();
calculator.setStrategy(new Addition());
int result = calculator.getResult(6, 5);
System.out.println(result);
//注入减法运算策略实现类,实现减法运算
calculator.setStrategy(new Subtraction());
result = calculator.getResult(6, 5);
System.out.println(result);
}
}
三 总结
策略模式总结:提供描述A、B、C策略的接口,分别实现ABC三种策略,使用时利用多态传入不同策略的实现类即可使用策略;
使用策略模式,其实现类成为独立于宿主之外的模块,即插即用。可以组合成为一个整体,又可以分拆独立,可以发生关联,但绝不耦合,既对立又统一,这是唯物辩证法的绝佳体现。
四 类UML图
源码地址:我的GitHub