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

这两个模式在进行个人重构的时候也使用了,当时是懵懵懂懂的,现在合作中又使用了一遍,思路清晰了很多,感觉这些设计模式之间有千丝万缕的联系,功夫还不到家还得慢慢的理一理,记得有个师哥说过“到最后会发现设计模式其实就一个”,所以努力吧!先看看这两个模式的应用。
职责链:确定消费时间
策略:计算不同类型卡的消费金额
职责链模式的好处比较直接的就是可以避免使用复杂的if语句,解耦了请求者和处理者,而且可以灵活的增加处理者,不会违背开放封闭原则。职责链模式的使用,是通过其中的OnLineCount来进行的,然后由调用其中的countTime()方法即可。

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层解耦。

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值