• [设计模式]策略模式和单一职责


    策略模式是用来封装了算法的;只要在分析过程中听到需要在不同时间内响应不同的业务规则,就可以考虑使用策略模式。

    例子:    超市的结算系统。

         1)打折 8折,3折       2)返利   满300-100,满100-20     3)不打折

    首先要将 界面的类 和 逻辑类 严格分开来。  这样逻辑类就可以运行在不同的系统上。

    遇到上面的例子首先按照下面步骤想

    1.不打折,打折,返利 可以分为3个算法类,共同继承一个抽象类

    2.打折 的具体折扣,8折,3折  是灵活的,设计的时候 要留意

    3.返利  的具体返利金额不同时期是不同的,所以设计的时候要留2个参数

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
     
    ///
    ///例子:超市结算系统。不打折结算,打折计算,返利结算
    ///
    namespace 策略模式
    {
        abstract class cashSuper
        {
            public abstract double acceptCash(double price);  //price原价
        }
     
     
        /// <summary>
        /// 不打折结算类
        /// </summary>
        class cashSuperNormal:cashSuper
        {
     
            public override double acceptCash(double price)
            {
                return price;
            }
     
        }
     
     
        /// <summary>
        /// 具体折扣,比如:8折,6折。
        /// </summary>
        class cashSuperRebate : cashSuper
        {
            public  double rebateCount=1d;    //折扣参数
            /// <summary>
            /// 初始化 折扣参数
            /// </summary>
            /// <param name="rebateCount">折扣参数</param>
            public cashSuperRebate(string rebateCount)             //疑问,参数是string 然后再转换,还是直接为double的更好
            {
                this.rebateCount = double.Parse(rebateCount);
     
            }
     
            public override double  acceptCash(double price)
            {
                return price * (this.rebateCount/10);
            }
     
        }
     
     
        class cashSuperFanli : cashSuper
        {
            public double fanliMoney = 0d;
            public double fanliCondition = 0d;
     
     
            /// <summary>
            /// 
            /// </summary>
            /// <param name="fanliMoney">返利金额</param>
            /// <param name="fanlicondition">返利条件(满多少才返)</param>
            public cashSuperFanli(string fanliMoney, string fanlicondition)
            {
                this.fanliMoney =double.Parse(fanliMoney);
                this.fanliCondition = double.Parse(fanlicondition);
            }
     
     
            public override double acceptCash(double price)
            {
                double result = price;
     
                if (price > fanliCondition)
                {
                    result = price - fanliMoney;
                }
     
                return result;
            }
     
        }
     
     
     
        /// <summary>
        /// 工厂类:根据参数 用来判断用哪个实例。此时用有个弊端。
        /// </summary>
        class cashSuperFactory
        {
     
     
            //根据传参
            public static cashSuper createCashSuper(string type)
            {
     
                cashSuper cs = null;
                switch (type)
                {
                    case "正常收费":
                        cs=new cashSuperNormal();
                        break;
                    case "8折":
                        cs = new cashSuperRebate("8");   //假如是9折的话,1折的话,此处的参数就不好了。最好再设计个类。
                        break;
     
                }
     
                return cs;
     
            }
     
     
     
        }
     
     
     
        /// <summary>
        /// 上下文类,客户端只需要知道context类就行了,降低了耦合度。
        /// 另外:几折和返利额度可以通过  界面中的值传值过来,如果后期需要修改 折数 只需要修改 context类即可了。
        /// </summary>
        class context
        {
            cashSuper cs = null;
     
            /// <summary>
            /// 此处就是工厂类的思想,根据参数来实例化不同对象
            /// </summary>
            /// <param name="type"></param>
            public context(string type)
            {
                switch (type)
                {
                    case "正常收费":
                        cs = new cashSuperNormal();
                        break;
                    case "8折":
                        cs = new cashSuperRebate("8");
                        break;
                    case "300返100":
                        cs = new cashSuperFanli("100", "300");
                        break;
     
                }
     
            }
     
            public double getResult(double money)
            {
     
                return cs.acceptCash(money);
     
            }
     
        }
     
    }
     

    总结:   策略设计模式就是  界面类 和逻辑类 分开; 界面调用逻辑类的时候,要耦合性低即 越少知道逻辑类 最好。

    类分开,耦合性低

    单一职责: 一个类的修改要有修改的原因,尽量让类只一个功能。就像DV 只有DV 的功能,而手机又可以照相有可以DV。           而手机的每个功能效果都一般。

  • 相关阅读:
    WC项目
    团队项目(MVP新能源无线充电管理网站)(总结)
    学期目标
    个人目标、思维导图、不同点
    结对项目——黄金分割点游戏(陈香宇&蔡春燕)
    团队项目(MVP新能源无线充电管理网站)(个人任务2)
    四则运算
    读后疑问
    crontab 定时任务
    mysql主从配置
  • 原文地址:https://www.cnblogs.com/StudyLife/p/2399520.html
Copyright © 2020-2023  润新知