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

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

例子:    超市的结算系统。

     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。           而手机的每个功能效果都一般。

原文地址:https://www.cnblogs.com/StudyLife/p/2399520.html