策略模式(Strategy)

策略模式:

就是定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,

比如在人力资源系统的薪资计算时,针对不同的人员会有不同的薪资计算方法,将这些算法

分离出来,就是策略模式,策略模式让算法独立于使用它的客户而独立变化。


下面以人力资源系统根据不同部门岗位计算薪资为例:


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).


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值