zoukankan      html  css  js  c++  java
  • 职责链+策略模式+外观实现用户下机

              上篇博客介绍了职责链模式加外观模式来实现下机计算下机时间,这篇博客主要介绍如何利用策略模式来实现计算用户的消费金额。首先来重温一下策略模式:

        策略模式:定义了算法族,并分别封装起来,让它们之间可以相互替换。此模式让算法的变化独立于使用算法的客户。我们利用策略模式,正是因为有不同的用户,而且他们的算钱方式之间相互么有影响!

        先看一下类图,一张图胜过千言万语。

        

         CashStrategy:抽象的算法类  

        public abstract class CashStrategy
        {
            #region 下机算钱抽象类 abstract decimal GetConsumeMoney(int ConsumeTime)
            /// <summary>
            ///   #region 下机算钱抽象类 
            /// </summary>
            /// <param name="ConsumeTime"></param>
            /// <returns></returns>
    		public abstract decimal GetConsumeMoney(int ConsumeTime);
            #endregion
        }

      

                CashTemporary:临时用户策略


        public class CashTemporary : CashStrategy
        {
    
            #region 具体策略类,封装一般用户的收费算法 override decimal GetConsumeMoney(int ConsumeTime)
            /// <summary>
    		/// 具体策略类,封装一般用户的收费算法
    		/// </summary>
            public override decimal GetConsumeMoney(int ConsumeTime)
            {
                BasicBLL basicbll = new BasicBLL();
                BasicDataEntity basicdataEntity = new BasicDataEntity();
                List<BasicDataEntity> basicdatalist;
    
                basicdataEntity.UseState = "使用";
                //获取临时用户每小时费用
                basicdatalist = basicbll.selectBasicData(basicdataEntity);
                decimal Temporary = basicdatalist[0].Temporary;
    
                //计算消费金额
                decimal ConsumeMoney;
                ConsumeMoney = ConsumeTime * (Temporary / 60);
    
                return ConsumeMoney;
            }
            #endregion
    
        }

      

          CashRegular:固定用户策略


       public class CashRegular : CashStrategy
        {
    
            #region 具体策略类,封装固定用户下机收费算法 override decimal GetConsumeMoney(int ConsumeTime)
            /// <summary>
    		/// 具体策略类,封装固定用户下机收费算法
    		/// </summary>
            public override decimal GetConsumeMoney(int ConsumeTime)
            {
                BasicBLL basicbll =new  BasicBLL ();
                BasicDataEntity basicdataEntity =new BasicDataEntity();
                List<BasicDataEntity> basicdatalist;
    
                basicdataEntity.UseState="使用";
                 //获取固定用户每小时费用
                basicdatalist = basicbll.selectBasicData(basicdataEntity);
                decimal regular = basicdatalist[0].Regular;
    
                //计算消费金额
                decimal ConsumeMoney;
                ConsumeMoney = ConsumeTime * (regular / 60);
    
                return ConsumeMoney;
            }
            #endregion
    
        }

     
             CashContext:上下文,用一个CashStrategy来配置,维护对Strategy对象的引用

        /// <summary>
        /// Context上下文,用一个CashStrategy来配置,维护一个对Strategy对象的引用
    	/// </summary>
    	public class CashContext {
    
            public CashStrategy cashStrategy;
    
            #region 用一个CashStrategy来配置Context上下文 CashContext(string CardType)
            /// <summary>
            /// 用一个CashStrategy来配置Context上下文
            /// </summary>
            /// <param name="CardType"></param>
            public CashContext(string CardType)
            {                         
                switch (CardType)
                { 
                    case "固定用户":
                        cashStrategy = new CashRegular();                   
                        break;
                    case "临时用户":
                        cashStrategy = new CashTemporary();
                        break;
                    default:
                        CardType = "";
                        break;
                }
                
            }
            #endregion
    
            #region 获得上机消费金额 decimal GetResult(int ConsumeTime)
            /// <summary>
            /// 获得上机消费金额
            /// </summary>
            /// <param name="ConsumeTime"></param>
            /// <returns></returns>
            public decimal GetResult(int ConsumeTime)
            {
                return cashStrategy.GetConsumeMoney(ConsumeTime);
            }
            #endregion
        }
        这里利用简单工厂来实现不同的用户调用不同的策略,根据传入参数的实例化不同的策略类,并进行调用计算上机的消费金额。客户端只需要调用一个类CashContext就可以了,可以降低与B的耦合。

       客户端调用:

        //调用策略模式计算消费金额
        CashContext cashcontext = new CashContext(cardEntity.CardType);
        decimal ConsumeMoney = cashcontext.GetResult(ConsumeTime);


      【总结】

       这次合作运用设计模式是对之前学习的一个深化,刚开始觉得用C#实现肯定很难,不过经过这几天的奋斗之后发现所有的困难都是自己想象出来的,只要去做就可以做到。





    
  • 相关阅读:
    WIN平台下ASE使用资源文件创建ASE服务
    C#高级编程笔记(三)
    C#高级编程笔记(四)
    高质量的HTML+CSS。
    C#高级编程笔记(二)
    编写高质量代码(JavaScript篇)
    C#高级编程笔记(一)
    开始博客+生活+学习
    巴中故里
    纱丽
  • 原文地址:https://www.cnblogs.com/zsswpb/p/6329462.html
Copyright © 2011-2022 走看看