Insus.NET在想,每在公司或是老板给自己发工资时,每个人都会重新计算一下自己的工资,是否正确。好象老板或是会计都会把自己的工资计错了似的。因此,每个都人都是工资计算高手。

工资计算,需要知道基本工资是多少; 否有加薪,加薪方式,是按基本工资的百分比来加,还是由得公司或是老板随心而加,表现加多些,表现不好加少一些;是否有加班,加班的方式也要清楚,工作天加班,普通假日加班,或是法定假日加班;是否有补帖等等。

每一种方式,在此也算得上是算法,完成的都是相同的工作,只是实现不同罢了。为了简化与分工,我们可以把每种算法写成一个独立的类,减少它们之间的耦合。

每个算法,返回一个结果,因此可以写一个抽象类,让每个算法类继承这个公共接口。


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02Wage


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for Wage
/// </summary>
namespace Insus.NET
{
public abstract class Wage
{
public abstract double Salary(double basicWage);
}
}


具体算法,基本工资:


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02BasicWage


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for BasicWage
/// </summary>
namespace Insus.NET
{
public class BasicWage :Wage
{
public override double Salary(double basicWage)
{
return basicWage;
}
}
}


去年公司业务好,收入丰,因此今年有得加薪,每个员工都是按基本工资百分比来加薪:


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02PlusWage


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for PlusWage
/// </summary>
namespace Insus.NET
{
public class PlusWage : Wage
{
private double _Rate = 1d;

public PlusWage(double rate) //加工资百分比
{
this._Rate = rate;
}

public override double Salary(double basicWage)
{
return basicWage * _Rate;
}
}
}


今年沿续去年的业务,项目需要加班完成:


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02OvertimeWage


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for OvertimeWage
/// </summary>
namespace Insus.NET
{
public class OvertimeWage : Wage
{
private double _Hours;
private double _OverTimeHourlyWage;
private bool _OfficialHoliday;

/// <summary>
///
/// </summary>
/// <param name="hours">加班小时数</param>
/// <param name="rate">加班每小时工资</param>
/// <param name="type">节假日,还是普通日</param>
public OvertimeWage(double hours, double overTimeHourlyWage, bool officialHoliday)
{
this._Hours = hours;
this._OverTimeHourlyWage = overTimeHourlyWage;
this._OfficialHoliday = officialHoliday;
}

public override double Salary(double basicWage)
{
double salary = _Hours * _OverTimeHourlyWage * basicWage;

if (_OfficialHoliday)
salary = salary * 3;

return salary;
}
}
}


 

更加多的公司福利算法....

接下来,为了上面各个算法引用,用一个WageContext类来处理:


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02WageContext


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

/// <summary>
/// Summary description for WageContext
/// </summary>
namespace Insus.NET
{
public class WageContext
{
private Wage _Wage;

public WageContext(string type)
{
switch (type)
{
case "基本工资":
_Wage = new BasicWage();
break;
case "加工资":
_Wage = new PlusWage(0.10);
break;
case "加班工资":
_Wage = new OvertimeWage(2, 10, true);
break;
}
}

public double GetSalary(double basicWage)
{
return _Wage.Salary(basicWage);
}
}
}


OK,我们来看看这新年后第一个月薪水,公司在加薪,又有加班。


自己工资自己算,策略设计模式(Strategy)_switch自己工资自己算,策略设计模式(Strategy)_Abstract_02WageDemo.aspx.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Insus.NET;

public partial class WageDemo : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//"基本工资"
//"加工资"
//"加班工资"

double basicWage = 8000d;

double total = 0.0d;
WageContext bw = new WageContext("基本工资");
total = bw.GetSalary(basicWage);


WageContext pw = new WageContext("加工资");
double plusSalary = pw.GetSalary(basicWage);
total = total + plusSalary;

Response.Write(total.ToString());
}
}


哈哈,有劳所获,开心一下子就行了,继续努力......