設計模式速記-政策模式
一、政策模式簡介
1. 什麼是政策模式
政策模式是一種對象行為型模式,政策模式定義:
政策模式針對于一組算法,旨在将這組算法的使用和實作分開。針對一系列具有共同目的的算法,用不同的類将每個算法封裝起來,使用算法時通過政策類來進行選擇。
是以,政策模式簡而言之,就是将算法的實作與使用分割開來;使用時必須了解各個算法類的特點特性,通過統一的執行類來使用。
2. 政策模式的優缺點
政策模式的主要優點如下:
- 多重條件語句不易維護,而使用政策模式可以避免使用多重條件語句。
- 政策模式提供了一系列的可供重用的算法族,恰當使用繼承可以把算法族的公共代碼轉移到父類裡面,進而避免重複的代碼。
- 政策模式可以提供相同行為的不同實作,客戶可以根據不同時間或空間要求選擇不同的。
- 政策模式提供了對開閉原則的完美支援,可以在不修改原代碼的情況下,靈活增加新算法。
- 政策模式把算法的使用放到環境類中,而算法的實作移到具體政策類中,實作了二者的分離。
政策模式的缺點如下:
- 用戶端必須了解所有政策算法的差別,以便适時選擇恰當的算法類。
- 政策模式造成很多的政策類。
3. 政策模式舉例
生活中可以見到很多涉及到政策模式的例子,如:
- 選擇出行方式;飛機、輪船、火車、汽車等都是一種政策。
- 選擇排序算法;針對不同的情況有不同的算法,冒泡、快排、希爾、堆排序等都各為一種政策;
二、政策模式示例
1. 政策模式涉及的角色
- 抽象政策接口:定義一個公共接口,讓不同的算法類實作此接口;
- 具體抽象類:實作了抽象政策接口的類,提供算法的具體實作;
- 環境類:持有一個政策類的引用,最終交給使用方調用。
2.示例代碼
示例代碼為使用政策模式來選擇出行方式:
- 抽象政策接口
/** * @Description 抽象政策接口 */ public interface TravelMethod { void travel(); }
- 具體抽象類
/** * @Description 輪船出行政策類 */ public class ShipTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by ship"); } } /** * @Description 飛機出行政策類 */ public class FlightTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by airplane"); } } /** * @Description 汽車出行政策類 */ public class BusTravelMethod implements TravelMethod { @Override public void travel() { System.out.println("travel by bus"); } }
- 環境類(負責具體政策執行)
/** * @Description 環境類,有權限執行政策 */ public class Context { private TravelMethod travelMethod; public Context(TravelMethod travelMethod){ this.travelMethod = travelMethod; } /** * 設定政策(出行方式) * @param travelMethod 出行方式政策類 */ public void setTravelMethod(TravelMethod travelMethod) { this.travelMethod = travelMethod; } /** * 執行政策 */ public void travel(){ this.travelMethod.travel(); } }
- 測試類用戶端
/** * @Description 政策模式測試 */ public class StrategyTest { @Test public void travelTest(){ TravelMethod busTravelMethod = new BusTravelMethod(); TravelMethod flightTravelMethod = new FlightTravelMethod(); TravelMethod shipTravelMethod = new ShipTravelMethod(); Context context = new Context(busTravelMethod); context.travel(); context.setTravelMethod(flightTravelMethod); context.travel(); context.setTravelMethod(shipTravelMethod); context.travel(); } }
- 測試結果
travel by bus
travel by airplane
travel by ship
三、參考文獻
- 菜鳥教程-政策模式
- C語言中文網-政策模式
- 百度百科-政策模式