</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