23种设计模式-20-策略者模式

策略接口:

/// <summary>
    /// 计算税后工资接口
    /// </summary>
    public interface ICalcSalaryAfterTaxStrategy
    {
        decimal CalcSalary(decimal money);
    }

不同策略实现类:

1.<=5000

/// <summary>
    /// 5000以下的计算策略
    /// </summary>
    public class CalcSalaryLessthan5000 : ICalcSalaryAfterTaxStrategy
    {
        public decimal CalcSalary(decimal money)
        {
            //5000以下不用缴纳税
            return money;
        }
    }

2.<=8000

/// <summary>
    /// 8000以下的计算策略
    /// </summary>
    public class CalcSalaryLessthan8000 : ICalcSalaryAfterTaxStrategy
    {
        public decimal CalcSalary(decimal money)
        {
            //5000到8000的部分缴纳10%,然后工资减去税得到税后工资
            return CoreService.MoneyFormat(Convert.ToDecimal(money - ((money - 5000) * Convert.ToDecimal(0.1))));
        }
    }

3.<=13000

/// <summary>
    /// 13000以下的计算策略
    /// </summary>
    public class CalcSalaryLessthan13000 : ICalcSalaryAfterTaxStrategy
    {
        public decimal CalcSalary(decimal money)
        {
            return CoreService.MoneyFormat(money - (8000 - 5000) * Convert.ToDecimal(0.1) - (money - 8000) * Convert.ToDecimal(0.2));
        }
    }

测试:

class Program
    {
        /// <summary>
        /// 策略者模式:
        /// 这是个很简单的模式,也是大家很常用的一个模式
        /// 上一个状态者模式说的是,一个对象通过不同的状态来展示出不同的形态,不同的业务逻辑
        /// 策略者模式也是如此,不同的策略展示出不同的结果
        ///
        /// 例如:
        /// 在计算税后工资时,我们需要根据税前工资计算出我们需要缴纳的税,减去这个税,才是我们的税后工资
        /// 但是不同的工资所需要的缴纳的税是不一样的,算法也是不一样的
        /// 比如现在5000以下不用缴税,5000到8000的部分是10%,8000到13000是20%等等
        /// 所以不同的工资计算的策略是不一样的
        ///
        /// 还有一个在开发中最常见的例子:
        /// 我们有很多数据库,如sqlserver,oracle,mysql,sqllite等等...
        /// 每个数据库都可以做增删改查,但是每个数据库如何去实现增删改查的策略是不一样的,这也是策略者模式
        ///
        /// 此文中的例子:计算税后工资
        /// 1.定义一个抽象类或者接口,在接口中定义一个行为:计算税后工资
        /// 2.分几个不同的类去实现这个接口,不同的类当然算法策略是不同的
        /// 3.然后客户端调用时,传递不同的策略,计算出不同的结果
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var calcService1 = new CalcSalaryService(new CalcSalaryLessthan5000());
            calcService1.CalcSalaryAfterTax(4800);
            Console.WriteLine("-----------------------------------------------------");
            var calcService2 = new CalcSalaryService(new CalcSalaryLessthan8000());
            calcService2.CalcSalaryAfterTax(7750);
            Console.WriteLine("-----------------------------------------------------");
            var calcService3 = new CalcSalaryService(new CalcSalaryLessthan13000());
            calcService3.CalcSalaryAfterTax(12500);
            Console.WriteLine("-----------------------------------------------------");
            Console.ReadKey();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值