zoukankan      html  css  js  c++  java
  • 自己工资自己算,策略设计模式(Strategy)

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

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

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

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

    Wage
    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);
        }
    }


    具体算法,基本工资:

    BasicWage
    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;
            }
        }
    }


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

    PlusWage
    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;
            }
        }
    }


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

    OvertimeWage
    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类来处理:

    WageContext
    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,我们来看看这新年后第一个月薪水,公司在加薪,又有加班。

    WageDemo.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());
        }
    }


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

  • 相关阅读:
    maven创建父子工程
    webservice之jersey简单实用
    EL表达式处理字符串
    oracle不等于1怎么查?
    day_07 搭建Tomcat服务器使用Servlet服务,后端接受前端请求过来的表单数据并使用
    Day_06 流程控制-循环结构-嵌套循环结构的原理解析
    Day05_流程控制02 循环结构
    day_5 流程控制 选择结构的两种常用语句的使用语法
    day_04 运算符详解
    day_03 变量的数据类型详解
  • 原文地址:https://www.cnblogs.com/insus/p/2939542.html
Copyright © 2011-2022 走看看