设计模式之策略模式

理解:以算法来举例,比如商场的各种促销算法,不管是正常售价,还是打折售价,还是满减,最后都是输出一个收费结果。所以可以建立一个父类,让各种收费算法继承这个父类。(但是,这个子类的构造可以添加参数,根据不同的促销模式,增加不同的参数需求)。利用简单工厂模式加策略模式结合,建立一个分割类,此类构造函数接收客户端的变化,根据变化反馈不同的算法类,此类有一个开放的获取结果的方法,这个方法封装变化,不管是哪一种的促销方式,此方法均同意返回计算结果。

在客户端,只需要认识一个类,而简单工厂模式却是需要客户端认识两个类的。示例如下:

///父类
  class Operation
    {
        public double  NumA { get; set; }

        public double NumB { get; set; }

        public virtual double  GetResult()
        {
            return NumA + NumB;
        }


    }

   ///子类继承
     class Add:Operation
    {
        public Add(double a,double b)
        {
            NumA = a;
            NumB = b;
        }
        public override double GetResult()
        {
          return  NumB + NumA;
        }
    }


   class Dec:Operation
    {
        public Dec(double a, double b)
        {
            NumA = a;
            NumB = b;
        }
        public override double GetResult()
        {
            return NumA-NumB;
        }
    }


   class DIV:Operation
    {

        public DIV(double a, double b)
        {
            NumA = a;
            NumB = b;
        }
        public override double GetResult()
        {
            if (NumB==0)
            {
                throw new Exception("被除数不能为0");
            }
            return NumA/NumB;
        }
    }


 class Mul:Operation
    {
        public Mul(double a, double b)
        {
            NumA = a;
            NumB = b;
        }
        public override double GetResult()
        {
            return NumA*NumB;
        }
    }


   class OtherOpration:Operation
    {
        public OtherOpration(double a,double b,double precent)
        {
            NumA = a;
            NumB = b;
            _precent = precent;
        }
        private double _precent;
        public override double GetResult()
        {
            return (NumA + NumB) * _precent;
        }

    }


 //分割类
     class CashContext
    {
        Operation operation;

        public CashContext(string str,double aNum,double bNum)
        {
            switch (str)
            {
                case "+":
                    operation = new Add(aNum,bNum);

                    break;

                case "-":
                    operation = new Dec(aNum, bNum);
                    break;

                case "*":
                    operation = new Mul(aNum, bNum);
                    break;

                case "/":
                    operation = new DIV(aNum, bNum);
                    break;
                case "other":
                    operation = new OtherOpration(aNum, bNum,0.5);
                    break;
                default:
                    operation = null;
                    break;
            }
        }


      public double  GetResult()
        {
            return operation.GetResult();
        }
    }


 class Program
    {
        static void Main(string[] args)
        {
            try
            {
            //客户端只需要认识这个类,简单工厂有可能还需要认识两个类
                CashContext operation = new CashContext("other", 3,4);
              double ny=  operation.GetResult();
                Console.WriteLine("获得计算的数值为:"+ny);
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine("当前计算出现异常:" + ex.Message);
                Console.ReadLine();
            }
        }
    }
    


  • 15
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值