zoukankan      html  css  js  c++  java
  • 策略模式

    策略模式是一种定义了一系列算法的方法,这些算法完成的都是类似的工作,只是实现不同,可以以相同的方法调用所有的算法,减少了各种算法类与使用算法类之间的耦合。一般只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性,下面用策略模式结合简单工厂模式实现商场的不同打折算法:

    1 多种打折算法的实现

         /// <summary>
        /// 打折算法接口
        /// </summary>
        public abstract class CashSuperStrategy
        {
            public abstract double CashCaulate(double money);
        }
    
        /// <summary>
        /// 不打折算法
        /// </summary>
        public class CashNormalStrategy : CashSuperStrategy
        {
            public override double CashCaulate(double money)
            {
                return money;
            }
        }
    
        /// <summary>
        /// 打折算法
        /// </summary>
        public class CashRebateStrategy : CashSuperStrategy
        {
            private double rebate = 1d;
    
            public CashRebateStrategy(double cashRebate)
            {
                this.rebate = cashRebate;
            }
    
            public override double CashCaulate(double money)
            {
                return money * rebate;
            }
        }
    
        /// <summary>
        /// 满额返现算法
        /// </summary>
        public class CashReturnStrategy : CashSuperStrategy
        {
            private double moneyConditon = 0d;
            private double moneyReturn = 0d;
    
            public CashReturnStrategy(double moneyConditon, double moneyReturn)
            {
                this.moneyConditon = moneyConditon;
                this.moneyReturn = moneyReturn;
            }
    
            public override double CashCaulate(double money)
            {
                double result = money;
                if (money>=moneyConditon)
                {
                    result = money - Math.Floor(money / moneyConditon) * moneyReturn; 
                }
                return result;
            }
        }
    

    2 引入Context类,根据客户端不同参数使用不同的算法 

        /// <summary>
        /// 结合策略模式和简单工厂模式
        /// </summary>
        public class Context
        {
            CashSuperStrategy strategy;
    
            /// <summary>
            /// 此处结合简单工厂模式,将实例化的职责由客户端转移到了Context类中
            /// 减轻了客户端的职责和客户端与算法类的耦合度
            /// </summary>
            /// <param name="discountType"></param>
            public Context(string discountType)
            {
                switch (discountType)
                {
                    case "正常收费":
                        strategy = new CashNormalStrategy();
                        break;
                    case "打7折":
                        strategy = new CashRebateStrategy(0.7);
                        break;
                    case "满300返100":
                        strategy=new CashReturnStrategy(300,100);
                        break;
                }
            }
    
            public double GetResult(double money)
            {
                return strategy.CashCaulate(money);
            }
        }
    

    3 客户端使用Context类,间接使用不同的算法

             /// <summary>
            /// 这种实现方法对于客户端,只需要认识Context类,完全不需要了解任何算法类,甚至不需要了解算法类的接口
            /// </summary>
            /// <param name="args"></param>
            static void Main(string[] args)
            {
                Context context1 = new Context("正常收费");
                double result1 = context1.GetResult(100);
                Console.WriteLine(result1);
                Console.ReadLine();
    
                Context context2 = new Context("打7折");
                double result2 = context2.GetResult(100);
                Console.WriteLine(result2);
                Console.ReadLine();
    
                Context context3 = new Context("满300返100");
                double result3 = context3.GetResult(300);
                Console.WriteLine(result3);
                Console.ReadLine();
            }
    

    执行代码,运行结果为:

    100

    70

    200

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行。而将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句。至于简单工厂中的条件语句则可以结合反射和配置文件解决。

  • 相关阅读:
    让8个数码管全部显示数字
    程序存储空间与内存
    点亮数码管,显示具体的数字
    为什么点亮小灯时,有时是输入数字0,有时是数字1
    循环点亮LED灯
    keil 编程时,总是中英文切换时,格式混乱。
    点亮LED灯
    学生管理系统(C 大一期末作业)
    ivew ui
    git常见操作
  • 原文地址:https://www.cnblogs.com/angela217/p/5359536.html
Copyright © 2011-2022 走看看