码迷,mamicode.com
首页 > 其他好文 > 详细

机房合作——职责链+策略模式

时间:2015-04-29 21:51:05      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:设计模式   策略模式   职责链模式   

</pre><p><span style="font-size: 24px;">这两个模式在进行个人重构的时候也使用了,当时是懵懵懂懂的,现在合作中又使用了一遍,思路清晰了很多,感觉这些设计模式之间有千丝万缕的联系,功夫还不到家还得慢慢的理一理,记得有个师哥说过“到最后会发现设计模式其实就一个”,所以努力吧!先看看这两个模式的应用。</span></p><p><span style="font-size: 24px;">职责链:确定消费时间</span></p><p><span style="font-size:24px">策略:计算不同类型卡的消费金额</span></p><p><span style="font-size:24px"> </span></p><p><span style="font-size:24px">职责链模式</span></p><p></p><p><span style="font-size:24px">职责链模式的好处比较直接的就是可以避免使用复杂的if语句,解耦了请求者和处理者,而且可以灵活的增加处理者,不会违背开放封闭原则。</span></p><p style="text-align:center"><img src="http://img.blog.csdn.net/20150429191705374" alt="" /></p><p><span style="font-size:24.44444465637207px">职责链模式的使用,是通过其中的OnLineCount来进行的,然后由调用其中的countTime()方法即可。</span></p><p><span style="font-size:24px"></span></p><pre name="code" class="csharp">public class OnlineTimeCountBLL {
		/// <summary>
		/// 计算消费时间
		/// </summary>
		/// <param name="enLine"></param>
		/// <param name="enBasicData"></param>
		public int CostTime(LineModel enLine, BasicDataModel enBasicData){
        //在实体里用的是decimal类型,但是在类里用的是int类型进行计算所以使用(int)
            PrepareTimeHandlerBLL prepareTime = new PrepareTimeHandlerBLL((int)(enBasicData.prepareTime));
            //实例化准备时间的类,同时用基本数据里的准备时间对其进行初始化
            UnitTimeHandlerBLL unitTime = new UnitTimeHandlerBLL((int)(enBasicData.unitTime));
            //实例化单位时间的类,同时用基本数据里的单位时间对其进行初始化
            LeastTimeHandlerBLL leasetTime = new LeastTimeHandlerBLL((int)(enBasicData.limTime));
            //实例化最少上机时间的类,同时用基本数据里的最少上机时间对其进行初始化

            
            //设置准备时间的后继者,如果准备时间处理不了,则用最少上机时间进行处理
            prepareTime.SetCalculate(leasetTime);
            //设置最少时间的后继者,如果最少时间处理不了,则用单位上机时间进行处理
            leasetTime.SetCalculate(unitTime);
            //调用准备时间的的方法开始进行处理
            return prepareTime.HandleTime((int)enLine.consumeTime);
		}
	}
通过时序图来整理一下逻辑

技术分享


策略模式

策略模式是包含了不同的计算方法适用于不同的情况,使用者可以不关心具体调用那个算法,可以通过其中的CountContext来确定。可以灵活的增加计算方法。

技术分享

策略模式的使用是通过CountContext来进行的,通过CountContext()方法来确定实例化那个子类,然后在CountAllCash中调用实例化的子类的方法。

    public class CountContextBLL
    {
        public CountSuperBLL m_CountSuperBLL;
        public CountContextBLL(string strCardType)
        {
            BasicDataBLL BasicDataBLL = new BasicDataBLL();
            List<BasicDataModel> myList = new List<BasicDataModel>();
            myList = BasicDataBLL.GetData();

            foreach (BasicDataModel BasicData in myList)
            {
                decimal decFix = BasicData.rate;//得到固定用户的收费标准
                decimal decTemp = BasicData.temporaryRate;//临时用户的收费标准
                switch (strCardType)
                {
                    case "固定用户"://如果是固定用户就实例化固定用户消费金额的计算
                        m_CountSuperBLL = new FixUserCashCountBLL(decFix);//初始化
                        break;
                    case "临时用户"://如果是临时用户就实例化固定用户消费金额的计算
                        m_CountSuperBLL = new tempUserCashCountBLL(decTemp);//初始化
                        break;
                    default :
                        break;

                }

            }

        }
        /// <summary>
        /// 供客户端调用的方法
        /// </summary>
        //上机时间作为参数,进行调用
        public decimal CountAllCash(int onlineTime)
        {
            return m_CountSuperBLL.CashCount(onlineTime);
            //实际调用的是在CountContext中的实例化的子类的方法
        }
    }
总结

       用完这两个模式有一种感觉,模式就是把我们本来写在一个类中的方法分别的写到子类中,在使用的时候根据不同的情况来实例化子类然后调用其中的方法。使得客户端调用时不用知道B层的方法具体是干什么的,避免了在使用时使用过多的if语句进行判断,一定程度上实现了U层和B层解耦。

      面向对象的认识知识开了个头,欢迎大家多多指教!

机房合作——职责链+策略模式

标签:设计模式   策略模式   职责链模式   

原文地址:http://blog.csdn.net/yxflovegs2012/article/details/45370367

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!