对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用。 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略接口 策略实现类 策略作用类(使用策略的类) 网络上的专业解释:
此模式下,一个类的行为或者其算法可以在运行时更改,我们要定义一系列的算法,把他们一个个封装起来,并使他们可以相互替换。
实例:用此模式描述四则运算,可不断替换。
以下是我对此实例做的类图:
以下是我编写代码: 1.创建策略接口,用来存放四则运算计算器中的不同运行的方法
//策略接口
interface Strategy {
int doAction(int num1,int num2);
}
2.创建实现策略接口的四则计算实现类
public class AddStrategy implements Strategy {
@Override
public int doAction(int num1, int num2) {
return num1+num2;
}
}
public class SubtractStrategy implements Strategy{
@Override
public int doAction(int num1, int num2) {
return num1-num2;
}
}
public class MultiplyStrategy implements Strategy {
@Override
public int doAction(int num1, int num2) {
return num1*num2;
}
}
public class DivisionStrategy implements Strategy {
@Override
public int doAction(int num1, int num2) {
return num1/num2;
}
}
3.创建一个使用某种策略的类,可以根据需求不同来使用不同的策略
public class Calculator {
private int num1;
private int num2;
public Calculator(int num1, int num2) {
this.num1 = num1;
this.num2 = num2;
}
public int operate(Strategy strategy){
return strategy.doAction(num1, num2);
}
}
4.创建测试类,使用不同的策略来实现需求
public class Test {
public static void main(String[] args) {
System.out.println("=========加法计算器==========");
Calculator calculator=new Calculator(1, 2);
System.out.println("1+2="+calculator.operate(new AddStrategy()));
System.out.println("=========减法计算器==========");
Calculator calculator1=new Calculator(10, 20);
System.out.println("10-20="+calculator1.operate(new SubtractStrategy()));
System.out.println("=========乘法计算器==========");
Calculator calculator2=new Calculator(3, 5);
System.out.println("3*5="+calculator2.operate(new MultiplyStrategy()));
System.out.println("=========除法计算器==========");
Calculator calculator3=new Calculator(10, 2);
System.out.println("10/2="+calculator3.operate(new DivisionStrategy()));
}
}
5.后台输出
=========加法计算器==========
1+2=3
=========减法计算器==========
10-20=-10
=========乘法计算器==========
3*5=15
=========除法计算器==========
10/2=5
看完代码之后,大家是不是感觉这种模式与状态模式是差不多的,是差不多,他俩原理都是用的覆盖嘛,但是状态模式的状态作用者里面要用到状态的实例对象,但是这个策略模式的策略使用者却是将策略当做参数来传入的,这样减少了对象的创建,提高了性能。
这种模式的优点:
1.如果我们要加一个相反数策略的话,只需要实现策略接口即可,体现了易扩展性,符合”开闭原则”。
2.算法在客户端可以根据需要自由切换,适应了不同需求。
3.在客户端使用将策略对象参数化的方法来调用具体策略的方法,避免在客户端新建对象实例,提高系统性能。
缺点:
1.策略使用类要知道所有的策略类才行,然后才能自行决定要用哪一个策略。
2.随着策略的不断增多,策略类也会不断的增多,提高后期的维护困难性。