设计模式之策略模式

来源:互联网 发布:舞台灯光编程软件 编辑:程序博客网 时间:2024/06/03 16:12

一、一切皆语义

一切皆语义,哪有什么扑朔迷离,正如我在上篇观察者模式中所说的那样,设计模式无非是把面向接口编程应用于不同的场景罢了。

二、策略之语义

策略就是算法,就是解决问题的过程。策略模式就是针对策略也就是算法玩的一些小把戏,当我们的程序设计中遇到了算法可变的情况时,利用面向接口编程的思想,我们应该能够想到把这些算法封装成为对象,并且让它们共同实现一个这些算法公有的程序接口。我们下面就以在面向对象学习过程中很多教材里举得一个经典例子做练习:雇员的薪水计算问题。

三、场景

某一公司把员工分为三个种,第一种是部门经理,经理的工资按年薪发放;第二种是普通员工,普通员工的工资按月发放;最后一种是小时工,工资按照小时发放。

四、代码实现

首先我们定义一个获取薪水方法的通用接口

public interface GetWage {public double getWage();}

然后针对不同的薪水计算方式我们分别实现GetWage接口

public class GetWageByYear implements GetWage{@Overridepublic double getWage() {//返回年薪/12return 200000/12.0;}}

上面是部门经理每个月应该拿到的薪水,算法是他的年薪20W除以12个月

public class GetWageByMonth implements GetWage{@Overridepublic double getWage() {return 5000;}}

上面是普通员工的月薪,我们直接给他5000块

public class GetWageByHour implements GetWage{@Overridepublic double getWage() {return 50*hours;}}

这个是小时工每个月拿到的薪水,费用是他每个月工作的小时总数乘以50块钱(每个小时50块,我相信你能算的清楚)

有了上面这三个具体的薪水计算类后,我们可以这样实现员工类

public class Employee {GetWage gw = null;public GetWage getGw() {return gw;}public void setGw(GetWage gw) {this.gw = gw;}public double getWage(){return gw.getWage();}}

员工类中并不直接使用具体的算法来实现getWage(),而是通过调用他拥有的gw对象来计算,而gw是GetWage类型的引用,它的计算方法要取决于它到底是什么类型的(上面三种实现的一种),或者当有新的种类员工时,我们的系统可以很容易把新的薪水计算方案加入到我们的员工管理系统,而不用改变已有的代码,想想这是多么让人兴奋的事情,我又可以省下几个小时来做其它事情了,我是说毕竟多陪陪女朋友不是更好的选择吗?

五、总结

策略模式在设计模式中算是最简单的模式了,当我们发现代码中对应的处理过程或者算法可能会发生改变时就应该想到策略模式,它会给我们的代码带来更好的可扩展性





0 0