策略模式的含义以及优势
针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。换句话说,当你的代码里面有很多不同场景的if -else的逻辑判断,并且他们都相互独立,那么我们就可以使用策略模式将它改造成的几个类来维护这些逻辑已达到解耦的作用。
策略模式的组成
1.抽象策略角色:这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。它作为所有实现类的父类,所有需要独立实现的逻辑都继承他以实现多态。
2.具体策略角色:包装了具体的算法和行为。对比来说,就是实现了抽象策略角色接口的实现一组实现类。
3.策略入口角色:此类的内部会持有一个抽象角色的引用,给客户端调用。即该类会持有一个抽象策略角色的成员变量,通过该变量,我们可以写一个方法接收客户端传来的要实现的参数,并返回相应结果。
策略模式具体实现
1.首先我们创建一个抽象策略角色,这里是一个计算接口,用来计算一组数字。
public interface Calculate {
double cal(int i,int j);
}
2.第二是我们写两个实现类实现计算接口,一个实现加法,一个实现减法。
public class Add implements Calculate {
@Override
public double cal(int i, int j) {
return i+j;
}
}
public class Subtraction implements Calculate {
@Override
public double cal(int i, int j) {
return i-j;
}
}
3.然后是对于这个计算接口编写了一个计算器类,用来作为计算的入口,他就相当于是为需要调用计算这个逻辑而提供一个一个服务入口。
public class Calculator {
private Calculate cal;
public Calculator(Calculate cal){
this.cal=cal;
}
public double getCalculate(int i,int j){
return cal.cal(i,j);
}
}
4.接着是测试类,用来模拟调用计算器类,实现我们的策略模式。
@Test
public void calculatorDemo(){
//此次计算加法,因此实现子类加法类
Calculate cal=new Add();
Calculator c=new Calculator(cal);
System.out.println("i为12,j为5,计算结果为:"+c.getCalculate(12,5));
此次计算减法,因此实现子类减法类
cal=new Subtraction();
c=new Calculator(cal);
c.getCalculate(12,5);
System.out.println("i为12,j为5,计算结果为:"+c.getCalculate(12,5));
}
5.最后是运行结果:
当你需要加法运算时,你通过接口new一个加法实现类出来,然后创建一个计算器类,以此作为入口进行传参计算,即可得到加法的计算结果;反之new一个减法实现类即可实现减法计算结果。