程序员人生 网站导航

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

栏目:php教程时间:2015-06-12 08:21:43

这两个模式在进行个人重构的时候也使用了,当时是懵懵懂懂的,现在合作中又使用了1遍,思路清晰了很多,感觉这些设计模式之间有千丝万缕的联系,工夫还不到家还得渐渐的理1理,记得有个师哥说过“到最后会发现设计模式其实就1个”,所以努力吧!先看看这两个模式的利用。
职责链:肯定消费时间
策略:计算不同类型卡的消费金额
职责链模式的好处比较直接的就是可以免使用复杂的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); } }
通过时序图来整理1下逻辑



策略模式

策略模式是包括了不同的计算方法适用于不同的情况,使用者可以不关心具体调用那个算法,可以通过其中的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中的实例化的子类的方法 } }
总结

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

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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐