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

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

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

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

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

  • 相关阅读:
    大话设计模式笔记(二十)の命令模式
    大话设计模式笔记(十九)の桥接模式
    大话设计模式笔记(十八)の单例模式
    大话设计模式笔记(十七)の迭代器模式
    反射的使用及其使用场景
    linq的简单使用
    XML的简单使用
    log4net的简单使用
    token
    axios在vue中的简单封装及应用
  • 原文地址:https://www.cnblogs.com/ARMdong/p/strategy.html
Copyright © 2011-2022 走看看