設計模式之旅(策略模式) 十號剛發工資的博友們,趕緊跟我一起算算你們的老板有沒有給你少發工資。。。


  折騰了一個晚上,現在總算是清靜了。下班跟老哥喝了一杯白的,(標准的一次性杯子,超市賣的那種),迎着醉意回到住處;剛打開電腦,想到今天一個網友的問題還沒有解決,趕緊聯系他開遠程,折騰了幾番,最后還是找到了問題的根源。。。問題解決了,看看桌面右下方的時間,已經十二點多了,想着今天剛發的工資還沒有驗證老板有沒有扣我錢呢,好吧,大家伙幫我一起算算吧!!!

  工資的計算,有很多種方式,比如說基本工資啊,項目提成啊,加班費啊,還有那啥,公司盈利、逢年過節啥的給點紅包,提高員工工作積極性等等(雖然我們公司是不會給你紅包的)。。。這里的每一種工資的計算方式都是一個算法,完成的工作都是相同的,不同的只是他們的實現不同罷了。好吧,為了減少耦合度,我們把每一種計算工資的算法都寫成一個獨立的類。 

  每種計算工資的算法,都返回一個結果,那就是錢。所以我們可以寫一個抽象類,讓每個計算工資的算法都繼承這個公共的接口。

工資類:(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/平米)買一套房子啊。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM