第四十三节课:
策略模式(strategy pattern):
策略模式是对算法(这里并不是指基本的算术运算,而是指程序运行中 CPU 所进行的
所有操作运算)的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象使
用。
策略模式通常把一个系列的算法包装到一系列的策略类里,作为一个抽象策略类的子
类;通俗的说,就是一个策略模式会将一系列的性质相同或相近的算法分别包装到对应的
策略类里,一个策略类对应一个算法,这些算法通常都是一些常用的、公共的方法等,这
些策略类都继承于一个抽象策略类,这个抽象策略类定义了所有方法实现的规范,也即对
外提供的一个接口,而客户可以通过抽象策略类提供的这个接口,实现自己的所要求的功
能。
策略模式的定义,定义算法族,并将每一个算法分别封装起来,使得它们之间可以互
换(每个策略类都继承于抽象策略类,而使用这个策略的一方持有一个策略类的引用,即
对该策略有一定了解,而抽象策略类中利用多态,可以接收其所有子类,所以这里,客户
可以将自己持有的策略类的引用作为参数传进去,只要是该抽象策略类的子类都可以传进
去,这样,利用多态,也提高了程序的弹性),此模式让算法的变化独立于使用算法的客
户(即客户只是将自己所持有的策略类的引用传进去,并不关心程序具体是怎样执行的,
而且由于这里采用的是多态,也可以隐藏真正的执行代码)。
策略模式的结构,它涉及到三个角色:环境角色,持有一个 strategy 类(策略类)的
引用,即是策略类的使用方;抽象策略角色,这是一个策略类,通常由一个接口或者抽象
类实现;具体策略角色,包装了相关的行为(或者算法)。
下面定义两种不同的实现“加减乘除”算术运算的模式,可以比较一下:
第一种:
public class ArithmeticDemo{
public double operate(double d1,double d2,char c){
double result = 0;
switch(c){//在 java 中的 switch 语句中,只能用 byte、short、int 和 char 型数据。
case ‘+’:
result = d1 + d2;
break;
case ‘-’:
result = d1 – d2;
break;
case ‘*’:
result = d1 * d2;
break;
case ‘/’:
result = d1 / d2;
break;
}
return result;
}
}
这个方法完全可以实现基本的算术运算,只需要调用方法时传三个参数。