過多的if-else**和巢狀,會使閱讀**的人很難理解到底是什麼意思。尤其是那些沒有注釋的**。其次是可維護性,因為if-else特別多,if-else是有辦法可以消除掉的,其中比較典型的並且使用廣泛的就是借助策略模式和工廠模式,準確的說是利用這兩個設計模式的思想,徹底消滅**中的if-else。
傳統用if else (偽**)
public bigdecimal calprice(bigdecimal orderprice, string buyertype)
}if (使用者是超級會員)
if (使用者是普通會員)
return 9折**;
}return 原價;
}策略模式
首先,定義乙個介面:
接著定義幾個策略類:
@override
public bigdecimal quote(bigdecimal orderprice) }}
public class supervippayservice implements userpayservice
}public class vippayservice implements userpayservice
return 9折**;}}
利用工廠模式讓**自己判斷使用策略
private static mapservices = new concurrenthashmap();
public static userpayservice getbyusertype(string type)
public static void register(string usertype,userpayservice userpayservice)
}這個userpayservicestrategyfactory中定義了乙個map,用來儲存所有的策略類的例項,並提供乙個getbyusertype方法,可以根據型別直接獲取對應的類的例項。
有了這個工廠類之後,計算**的**即可得到大大的優化:
string viptype = user.getviptype();
userpayservice strategy = userpayservicestrategyfactory.getbyusertype(viptype);
return strategy.quote(orderprice);
}最後我們利用spring呼叫register方法,把spring通過ioc建立出來的bean註冊進去就行了。
這種需求,可以借用spring種提供的initializingbean介面,這個介面為bean提供了屬性初始化後的處理方法,它只包括afterpropertiesset方法,凡是繼承該介面的類,在bean的屬性初始化後都會執行該方法。
將前面的各個策略類稍作改造:
@override
public bigdecimal quote(bigdecimal orderprice)
}@override
public void afterpropertiesset() throws exception
}@service
public class supervippayservice implements userpayservice ,initializingbean
@override
public void afterpropertiesset() throws exception
}@service
public class vippayservice implements userpayservice,initializingbean
return 9折**;
}@override
public void afterpropertiesset() throws exception
}只需要每乙個策略服務的實現類都實現initializingbean介面,並實現其afterpropertiesset方法,在這個方法中呼叫userpayservicestrategyfactory.register即可。
這樣,在spring初始化的時候,當建立vippayservice、supervippayservice和particularlyvippayservice的時候,會在bean的屬性初始化之後,把這個bean註冊到userpayservicestrategyfactory中。
策略模式和簡單工廠模式
策略模式和簡單工廠模式有什麼不同額?最近在學習設計模式,遇到這兩種模式,有點兒迷糊?簡單工廠模式 public class operation return result private double numbera 0 public double numbera set private doubl...
簡單工廠模式和策略模式
兩種模式如出一轍,基本方式都是通過將相同的行為封裝在乙個抽象父類 或介面 中,然後子類繼承該抽象父類並對該相同的行為進行不同的實現。簡單工廠模式 目的在於根據不同的條件建立不同的子類,工廠類的作用就是建立類。策略模式 比簡單工廠模式多了乙個context類,該類中保持對乙個策略父類的引用。該模式對策...
簡單工廠模式和策略模式
簡單工廠模式是用來當客戶端要判斷採用什麼方法時,把這部分判斷分離出來,放到工廠類中,只要輸入可以鑑別的資訊時就可了,比如計算時的符號,然後在工廠類中判斷用哪種運算類。選擇類 而策略模式中,在工廠類中呼叫的類,他的方法的引數形式可能是不同的,這時候就是不同的策略,那麼就需要建立不同的策略,這時候我們就...