天天看點

設計模式速記-政策模式

設計模式速記-政策模式

一、政策模式簡介

1. 什麼是政策模式

政策模式是一種對象行為型模式,政策模式定義:

政策模式針對于一組算法,旨在将這組算法的使用和實作分開。針對一系列具有共同目的的算法,用不同的類将每個算法封裝起來,使用算法時通過政策類來進行選擇。

是以,政策模式簡而言之,就是将算法的實作與使用分割開來;使用時必須了解各個算法類的特點特性,通過統一的執行類來使用。

2. 政策模式的優缺點

政策模式的主要優點如下:

  • 多重條件語句不易維護,而使用政策模式可以避免使用多重條件語句。
  • 政策模式提供了一系列的可供重用的算法族,恰當使用繼承可以把算法族的公共代碼轉移到父類裡面,進而避免重複的代碼。
  • 政策模式可以提供相同行為的不同實作,客戶可以根據不同時間或空間要求選擇不同的。
  • 政策模式提供了對開閉原則的完美支援,可以在不修改原代碼的情況下,靈活增加新算法。
  • 政策模式把算法的使用放到環境類中,而算法的實作移到具體政策類中,實作了二者的分離。

政策模式的缺點如下:

  • 用戶端必須了解所有政策算法的差別,以便适時選擇恰當的算法類。
  • 政策模式造成很多的政策類。

3. 政策模式舉例

生活中可以見到很多涉及到政策模式的例子,如:

  • 選擇出行方式;飛機、輪船、火車、汽車等都是一種政策。
  • 選擇排序算法;針對不同的情況有不同的算法,冒泡、快排、希爾、堆排序等都各為一種政策;

二、政策模式示例

1. 政策模式涉及的角色

  1. 抽象政策接口:定義一個公共接口,讓不同的算法類實作此接口;
  2. 具體抽象類:實作了抽象政策接口的類,提供算法的具體實作;
  3. 環境類:持有一個政策類的引用,最終交給使用方調用。

2.示例代碼

示例代碼為使用政策模式來選擇出行方式:

  1. 抽象政策接口
    /**
     * @Description 抽象政策接口
     */
    public interface TravelMethod {
        void travel();
    }
    
               
  2. 具體抽象類
    /**
     * @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");
        }
    }
               
  3. 環境類(負責具體政策執行)
    /**
     * @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();
        }
    }
               
  4. 測試類用戶端
    /**
     * @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();
        }
    }
               
  5. 測試結果

    travel by bus

    travel by airplane

    travel by ship

三、參考文獻

  • 菜鳥教程-政策模式
  • C語言中文網-政策模式
  • 百度百科-政策模式