设计模式之旅(策略模式) 十号刚发工资的博友们,赶紧跟我一起算算你们的老板有没有给你少发工资。。。

  折腾了一个晚上,现在总算是清静了。下班跟老哥喝了一杯白的,(标准的一次性杯子,超市卖的那种),迎着醉意回到住处;刚打开电脑,想到今天一个网友的问题还没有解决,赶紧联系他开远程,折腾了几番,最后还是找到了问题的根源。。。问题解决了,看看桌面右下方的时间,已经十二点多了,想着今天刚发的工资还没有验证老板有没有扣我钱呢,好吧,大家伙帮我一起算算吧!!!

  工资的计算,有很多种方式,比如说基本工资啊,项目提成啊,加班费啊,还有那啥,公司盈利、逢年过节啥的给点红包,提高员工工作积极性等等(虽然我们公司是不会给你红包的)。。。这里的每一种工资的计算方式都是一个算法,完成的工作都是相同的,不同的只是他们的实现不同罢了。好吧,为了减少耦合度,我们把每一种计算工资的算法都写成一个独立的类。 

  每种计算工资的算法,都返回一个结果,那就是钱。所以我们可以写一个抽象类,让每个计算工资的算法都继承这个公共的接口。

工资类:(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/平米)买一套房子啊。。。

原文地址:https://www.cnblogs.com/ARMdong/p/strategy.html