策略模式:
就是定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,
比如在人力资源系统的薪资计算时,针对不同的人员会有不同的薪资计算方法,将这些算法
分离出来,就是策略模式,策略模式让算法独立于使用它的客户而独立变化。
下面以人力资源系统根据不同部门岗位计算薪资为例:
public class Salary {
public double doSalary(String type) {
if(type.equals("行政人员")){
System.out.println("对于行政人员,每个月只有基本工资");
}else if(type.equals("销售人员")){
System.out.println("对于销售人员,每个月通过业绩来确定工资");
}else if(type.equals("生产人员")){
System.out.println("对于生产人员,每个月通过生产量来确定工资");
}
return 0;
}
}
上面的写法非常普遍,实现起来也比较容易,符合一般开发人员的编写代码思路,但是这里有一个问题,就是假如各种类别的人员比较多,
则条件判断会很多,而且如果工资的算法很复杂,则程序变得很长,难于维护,要怎么修改呢?示意代码如下:
public class Salary {
public double doSalary(String type) {
if(type.equals("行政人员")){
doOfficeSalary();
}else if(type.equals("销售人员")){
doSaleSalary();
}else if(type.equals("生产人员")){
doProduceSalary();
}
return 0;
}
// 行政人员薪资计算逻辑
private void doOfficeSalary() {
System.out.println("对于行政人员,每个月只有基本工资");
}
// 销售人员薪资计算逻辑
private void doSaleSalary() {
System.out.println("对于销售人员,每个月通过业绩来确定工资");
}
// 生产人员薪资计算逻辑
private void doProduceSalary() {
System.out.println("对于生产人员,每个月通过生产量来确定工资");
}
}
可以看到,这种写法比前面的容易理解,把各种人员的薪资计算方式独立抽取出来,如果以后某种人员的算法改变了,
只要修改其中的一个方法即可,但再分析上面这种方式,还是有很大的问题,就是条件语句太多的问题还是没有解决,
根本原因,就在于算法和使用算法的客户是耦合的,此时就需要使用策略模式的方式。
先把所有的计算方式独立出来,每个计算方式做成一个单独的算法类,从而形成一系列的算法,并且为这一系列算法定义一个
公共的接口,这些算法都实现这些公共接口,可以相互替换。
以下为使用策略模式实现:
// 薪资计算接口
public interface SalaryInterface {
public void doSalary();
}
// 行政人员的薪资计算类
public class OfficeSalary implements SalaryInterface{
public void doSalary() {
System.out.println("对于行政人员,每个月只有基本工资");
}
}
// 销售人员的薪资计算类
public class SaleSalary implements SalaryInterface{
public void doSalary() {
System.out.println("对于销售人员,每个月通过业绩来确定工资");
}
}
// 生产人员的薪资计算类
public class ProduceSalary implements SalaryInterface {
public void doSalary() {
System.out.println("对于生产人员,每个月通过生产量来确定工资");
}
}
// 具体的薪资计算类示意代码
public class Salary {
private SalaryInterface salaryInterface;
public Salary(SalaryInterface salaryInterface){
this.salaryInterface = salaryInterface;
}
public void doSalary() {
salaryInterface.doSalary();
}
}
// 客户端代码
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// 计算行政人员工资
Salary salary = new Salary(new OfficeSalary());
salary.doSalary();
// 计算销售人员工资
salary = new Salary(new SaleSalary());
salary.doSalary();
// 计算生产人员工资
salary = new Salary(new ProduceSalary());
salary.doSalary();
}
}
====>>>>>运行结果:
对于行政人员,每个月只有基本工资
对于销售人员,每个月通过业绩来确定工资
对于生产人员,每个月通过生产量来确定工资
通过上述示例可以看到,条件语句消失了,以后有新的某种类型人员的工资计算,只需增加新的薪资计算实现类即可
其他代码不需要发生变动!
策略模式主要由三部分组成:抽象策略类(SalaryInterface),具体策略类(OfficeSalary),上下文场景类(Salary).