折騰了一個晚上,現在總算是清靜了。下班跟老哥喝了一杯白的,(標准的一次性杯子,超市賣的那種),迎着醉意回到住處;剛打開電腦,想到今天一個網友的問題還沒有解決,趕緊聯系他開遠程,折騰了幾番,最后還是找到了問題的根源。。。問題解決了,看看桌面右下方的時間,已經十二點多了,想着今天剛發的工資還沒有驗證老板有沒有扣我錢呢,好吧,大家伙幫我一起算算吧!!!
工資的計算,有很多種方式,比如說基本工資啊,項目提成啊,加班費啊,還有那啥,公司盈利、逢年過節啥的給點紅包,提高員工工作積極性等等(雖然我們公司是不會給你紅包的)。。。這里的每一種工資的計算方式都是一個算法,完成的工作都是相同的,不同的只是他們的實現不同罷了。好吧,為了減少耦合度,我們把每一種計算工資的算法都寫成一個獨立的類。
每種計算工資的算法,都返回一個結果,那就是錢。所以我們可以寫一個抽象類,讓每個計算工資的算法都繼承這個公共的接口。
工資類:(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); } }
基本工資:

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; } } }
項目提成:

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; } } }
加班費:

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類處理每個算法:

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); } } }
來來來,大家伙幫我算算還剩下多少錢。。。

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/平米)買一套房子啊。。。