用工廠模式和策略模式代替繁瑣的if else

2021-10-05 19:29:22 字數 2144 閱讀 2813

過多的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類,該類中保持對乙個策略父類的引用。該模式對策...

簡單工廠模式和策略模式

簡單工廠模式是用來當客戶端要判斷採用什麼方法時,把這部分判斷分離出來,放到工廠類中,只要輸入可以鑑別的資訊時就可了,比如計算時的符號,然後在工廠類中判斷用哪種運算類。選擇類 而策略模式中,在工廠類中呼叫的類,他的方法的引數形式可能是不同的,這時候就是不同的策略,那麼就需要建立不同的策略,這時候我們就...