这两个模式在进行个人重构的时候也使用了,当时是懵懵懂懂的,现在合作中又使用了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层解耦。
面向对象的认识知识开了个头,欢迎大家多多指教!