LieBrother原文:
行爲型模式:策略模式java
十一大行爲型模式之五:策略模式。git
姓名 :策略模式github
英文名 :Strategy Pattern算法
價值觀 :集計謀於一身設計模式
我的介紹 :
Define a family of algorithms,encapsulate each one,and make them interchangeable.
定義一組算法,將每一個算法都封裝起來,而且使它們之間能夠互換。
(來自《設計模式之禪》)ide
先看一張拍得很差看的圖片ui
天天上完班回到家第一件事情是幹啥?有人一進門就躺在沙發上閉目養神、有人一進門躺在沙發上玩手機、有人一進門就陪本身的小寵物玩等等。而我進門第一件事就是洗澡,洗完澡很容易就把一成天的疲憊感給消除掉,而後就能夠開始美好的下班時光。現實沒那麼美好,洗完澡後還要洗衣服,大學手洗了 4 年的衣服,一出來工做,宿舍第一必需品就是洗衣機。細看洗衣機,有不少種洗衣類型,好比:標準、大物、快洗、輕柔。洗衣類型的區別在於洗衣服的過程不同,洗衣過程包括有浸泡、洗滌、漂洗、脫水,還有洗衣服的時間也不同。細想能夠發現這 4 種洗衣類型實際上是洗衣服的 4 種不一樣的策略,也便是 4 種不一樣的算法。根據這個思路,咱們能夠用代碼實現它,定義一個接口 WashingStrategy 定義洗衣服類型,而這些類型都有各自的洗衣過程,好比標準洗衣類型就包括浸泡、洗滌、漂洗、脫水,而快洗則只包括洗滌、漂洗、脫水。而咱們洗衣服則須要選擇某個洗衣類型後,洗衣機就開始工做了。過程以下代碼所示。this
public class StrategyTest { public static void main(String[] args) { WashingStrategy washingStrategy = new StandardWashingStrategy(); WashingMachine washingMachine = new WashingMachine(washingStrategy); washingMachine.washingClothes(); } } /** * 洗衣類型 */ interface WashingStrategy { void washing(); } /** * 洗衣機 */ class WashingMachine { private WashingStrategy washingStrategy; public WashingMachine(WashingStrategy washingStrategy) { this.washingStrategy = washingStrategy; } public void washingClothes() { this.washingStrategy.washing(); } } /** * 標準 */ class StandardWashingStrategy implements WashingStrategy{ @Override public void washing() { System.out.println("標準流程:"); System.out.println("[浸泡] 10 分鐘"); System.out.println("[洗滌] 2 次,每次 15 分鐘"); System.out.println("[漂洗] 1 次,每次 10 分鐘"); System.out.println("[脫水] 5 分鐘"); System.out.println("總共耗時:55 分鐘"); } } /** * 快洗 */ class QuickWashingStrategy implements WashingStrategy { @Override public void washing() { System.out.println("快洗流程:"); System.out.println("[洗滌] 1 次,每次 10 分鐘"); System.out.println("[漂洗] 1 次,每次 10 分鐘"); System.out.println("[脫水] 5 分鐘"); System.out.println("總共耗時:25 分鐘"); } } /** * 大物 */ class BigClothesWashingStrategy implements WashingStrategy { @Override public void washing() { System.out.println("大物流程:"); System.out.println("[浸泡] 30 分鐘"); System.out.println("[洗滌] 3 次,每次 15 分鐘"); System.out.println("[漂洗] 2 次,每次 10 分鐘"); System.out.println("[脫水] 5 分鐘"); System.out.println("總共耗時:100 分鐘"); } } /** * 輕柔 */ class SoftWashingStrategy implements WashingStrategy { @Override public void washing() { System.out.println("輕柔流程:"); System.out.println("[浸泡] 10 分鐘"); System.out.println("[漂洗] 2 次,每次 15 分鐘"); System.out.println("[脫水] 5 分鐘"); System.out.println("總共耗時:45 分鐘"); } } 標準流程: [浸泡] 10 分鐘 [洗滌] 2 次,每次 15 分鐘 [漂洗] 1 次,每次 10 分鐘 [脫水] 5 分鐘 總共耗時:55 分鐘
是否是感受策略模式很簡單呢?上面代碼就是完整的策略模式示例,是否是感受有些問題,這 4 種洗衣類型對象徹底暴露給了用戶,這也是策略模式的缺點。每每策略模式不會單獨使用,會和其餘設計模式一塊兒使用,好比和簡單工廠模式一塊兒使用就能夠解決這個對外暴露對象的問題,看下面代碼。設計
/** * 洗衣類型選擇 */ class WashingFactory { public static WashingStrategy getWashingStrategy(String type) { if ("Quick".equals(type)) { return new QuickWashingStrategy(); } if ("BigClothes".equals(type)) { return new BigClothesWashingStrategy(); } if ("Soft".equals(type)) { return new SoftWashingStrategy(); } return new StandardWashingStrategy(); } } public class StrategyTest { public static void main(String[] args) { WashingStrategy washingStrategy2 = WashingFactory.getWashingStrategy("Soft"); WashingMachine washingMachine2 = new WashingMachine(washingStrategy2); washingMachine2.washingClothes(); } } 打印結果: 輕柔流程: [浸泡] 10 分鐘 [漂洗] 2 次,每次 15 分鐘 [脫水] 5 分鐘 總共耗時:45 分鐘
代碼中使用 WashingFactory 來封裝 4 種策略,使得策略沒有對外暴露,咱們也瞭解到設計模式之間具備互補的關係,有些時候並非單獨存在的。code
代碼:
Strategy Pattern
策略模式是一個很好的封裝各類複雜處理的設計模式,讓使用者根據本身的選擇來選中策略,而不用修改其餘代碼。當策略太多的時候,可能形成使用方變得複雜、難管理多個策略的問題,利用工廠方法模式能夠很好的解決這個難題。這其中也是一個見招拆招的問題,設計模式在真正運用中也是這樣子的,遇到問題使用恰當的設計模式去解決問題。
參考資料:《大話設計模式》、《設計模式之禪》
推薦閱讀:
但願文章對您有所幫助,設計模式系列會持續更新,感興趣的同窗能夠關注公衆號:LieBrother,第一時間獲取文章推送閱讀,也能夠一塊兒交流,交個朋友。