设计模式之旅(策略模式) 十号刚发工资的博友们,赶紧跟我一起算算你们的老板有没有给你少发工资。。。
2013-05-11 02:00 ARMdong 阅读(3381) 评论(27) 编辑 收藏 举报折腾了一个晚上,现在总算是清静了。下班跟老哥喝了一杯白的,(标准的一次性杯子,超市卖的那种),迎着醉意回到住处;刚打开电脑,想到今天一个网友的问题还没有解决,赶紧联系他开远程,折腾了几番,最后还是找到了问题的根源。。。问题解决了,看看桌面右下方的时间,已经十二点多了,想着今天刚发的工资还没有验证老板有没有扣我钱呢,好吧,大家伙帮我一起算算吧!!!
工资的计算,有很多种方式,比如说基本工资啊,项目提成啊,加班费啊,还有那啥,公司盈利、逢年过节啥的给点红包,提高员工工作积极性等等(虽然我们公司是不会给你红包的)。。。这里的每一种工资的计算方式都是一个算法,完成的工作都是相同的,不同的只是他们的实现不同罢了。好吧,为了减少耦合度,我们把每一种计算工资的算法都写成一个独立的类。
每种计算工资的算法,都返回一个结果,那就是钱。所以我们可以写一个抽象类,让每个计算工资的算法都继承这个公共的接口。
工资类:(Wage)
Wage
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatternTravel.Strategy { /// <summary> /// 工资的抽象类 /// </summary> public abstract class Wage { public abstract double Salary(double wage); } }
基本工资:
BasicWage
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatternTravel.Strategy { /// <summary> /// 基本工资 /// </summary> public class BasicWage : Wage { public override double Salary(double wage) { return wage; } } }
项目提成:
ProjectWage
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatternTravel.Strategy { /// <summary> /// 项目提成 /// </summary> public class ProjectWage : Wage { private double _rate; public ProjectWage(double rate) { this._rate = rate; } public override double Salary(double wage) { //项目提成按工资的百分比给的 return wage * _rate; } } }
加班费:
BloodWage
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatternTravel.Strategy { /// <summary> /// 加班费 /// </summary> public class BloodWage:Wage { private double _hours; private double _moneyPerHour; private bool _isHoliday; /// <summary> /// 血汗钱 /// </summary> /// <param name="hours">加班小时</param> /// <param name="moneyPerHour">每小时多少钱</param> /// <param name="isHoliday">是节假日还是普通工作日</param> public BloodWage(double hours, double moneyPerHour, bool isHoliday) { this._hours = hours; this._moneyPerHour = moneyPerHour; this._isHoliday = isHoliday; } public override double Salary(double wage) { double salary = _hours * _moneyPerHour; if (_isHoliday) { //节假日工资是平时的三倍 salary = salary * 3; } return salary; } } }
由于我们公司没有其他的福利,所以其他的算法你们自己加吧...
下面,由WageContext类处理每个算法:
WageContext
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace DesignPatternTravel.Strategy { public class WageContext { private Wage _wage; public WageContext(string wageType) { switch (wageType) { case "基本工资": _wage = new BasicWage(); break; case "项目提成": _wage = new ProjectWage(0.10); break; case "加班费": _wage = new BloodWage(20, 20, true); break; } } public double GetSalary(double wage) { return _wage.Salary(wage); } } }
来来来,大家伙帮我算算还剩下多少钱。。。
Default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using DesignPatternTravel.Strategy; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { /// <summary> /// 基本工资 /// 项目提成 /// 加班费 /// </summary> double basicWage = 5000d; double total = 0.0d; //基本工资 WageContext basicContext = new WageContext("基本工资"); total += basicContext.GetSalary(basicWage); //项目提成 WageContext projectContext = new WageContext("项目提成"); total += projectContext.GetSalary(basicWage); //加班费 WageContext bloodContext = new WageContext("加班费"); total += bloodContext.GetSalary(basicWage); Response.Write("您本月的工资为:" + total.ToString()); } }
在上海,辛辛苦苦大半年,出门一趟就回到解放前。。。(减去房租-1000,吃饭-1000,朋友聚餐-500,各种零用-500,带女朋友逛商场-1000)
尼玛,什么时候能在“老家”(6000~7000/平米)买一套房子啊。。。
姓名:王卯东
英文名:Michael
QQ:942352461
Email:armdong@163.com
主要研究方向:javascript,require.js;