策略模式:属于行为型设计模式,是比较简单的设计模式之一,在代码中运用也是比较简单和广泛的。
先来一个定义:定义一系列的算法,把它们一个个封装起来,并且使他们可以互相替换。
大白话翻译:我这里搞了几个方案,你给我你的资料,我可以通过这几个方案给你搞出不同的效果出来。
很多人在学习了工厂模式后再来学习策略模式,这时就一脸懵逼了,这不就是“工厂模式”吗?非也非也,工厂模式是属于创建型设计模式,专注于对象的创建(也就是new
这一块),达到代码的解耦,而策略模式属于行为型设计模式,专注于
行为处理上(就像我上面说的不同方案,对于你提供的资料用不同的方案那么实现的行为就不一样),从而实现代码的解耦。
策略模式
下面又到了举例子时间:
例如有一台计算器,可以输入数字,上面还有几个模式按钮分别是模式1,模式2和默认模式。每个模式都是不同的计算逻辑,你只需要输入3个数,选对应的模式就可以得到通过这个模式计算出的答案
上码:
//把计算功能设计为接口
public interface Calculation {
public void calculate(int num);
}
//模式一 计算逻辑是:额外加100
public class ModeOne implements Calculation{
@Override
public void calculate(int num) {
int result = num+100;
System.out.println("策略一 拿到值,再加上100 结果:"+result);
}
}
//模式二 计算逻辑是:额外乘以5
public class ModeTwo implements Calculation{
@Override
public void calculate(int num) {
int result = num*5;
System.out.println("策略二 拿到值,再乘以5 结果:"+result);
}
}
//默认模式 计算逻辑是:不做额外运算
public class ModeDefault implements Calculation {
@Override
public void calculate(int num) {
//空策略,空模式
System.out.println("不做额外运算");
}
}
//实现计算器
public class Calculator {
private Calculation calculation = null;
public Calculator() {
calculation = new ModeDefault();
}
public Calculator(Calculation calculation) {
this.calculation = calculation;
}
public void setCalculation(Calculation calculation) {
this.calculation = calculation;
}
public void getResult(int num1, int num2){
int sum = num1+num2;
System.out.println("计算器拿到输入的值后先进行加法计算, 结果:"+sum);
calculation.calculate(sum);
}
}
//用户使用计算器输入数字和选择模式得到答案
public class Client {
public static void main(String[] args) {
Calculator calculator = new Calculator();
calculator.getResult(1,2);
System.out.println("=====================================================");
calculator.setCalculation(new ModeOne());
calculator.getResult(1,2);
System.out.println("=====================================================");
calculator.setCalculation(new ModeTwo());
calculator.getResult(1,2);
}
}
运行结果:
上面的代码中,模式一,模式二和默认模式,就是我们所说的策略,在输入同样的原始参数进去,通过更换不同策略,我们得到了不同的结果。
扩展
这里写了一个默认的策略,ModeDefault
,这样做的好处是避免了在上面调用的时候,需要对策略判空,从而避免了漏写判空而产生bug。
一千个读者就有一千个哈姆雷特,以上纯属于我个人的学习心得,如果有哪里写得不对,请大家指出,让我好学习一波,纠正错误,谢谢!