天天看點

設計模式之政策模式

記得在中學時代,每次考完老師評講試卷,都會說這道題有多少種解法,然後在黑闆上闆書第一種、第二種等解法,其實這個情況就類似于今天的情況,也就是政策模式。他表示的是在遇到一種問題有多種解法的時候,我們可以根據環境或者條件的不同選擇不同的算法或者政策來完成該功能。OK,正式開始今天的文章:

一、了解政策模式

為了更好的了解這個模式,我們再舉一個例子,我們出去旅遊的時候可能有很多種出行方式,比如說我們可以坐火車,坐高鐵,坐飛機等等。不管我們使用哪一種出行方式,最終的目的地都是一樣的,也就是選擇不同的方式産生的結果都是一樣的。

設計模式之政策模式
有了這個例子,我相信你應該對其思想有了一個基本的認識,下面看一下其正式的概念介紹:

定義一系列的算法,把每一個算法封裝起來, 并且使它們可互相替換

二、實作政策模式

政策模式把對象本身和運算規則區分開來,是以我們整個模式也分為三個部分。

  • 環境類(Context):用來操作政策的上下文環境,也就是我們遊客。
  • 抽象政策類(Strategy):政策的抽象,出行方式的抽象
  • 具體政策類(ConcreteStrategy):具體的政策實作,每一種出行方式的具體實作。

下面我們代碼去實作一遍就能很清楚的了解了,

第一步:定義抽象政策接口

interface TravelStrategy{
    public function travelAlgorithm();
}      

第二步:具體政策類

//第一種:使用火車
public class TrainStrategy implements TravelStrategy{
    @Override
    public void travelStyle() {
        System.out.println("乘坐火車。。。");
        }
}
//第二種:使用高鐵
public class HighTrainStrategy implements TravelStrategy {
    @Override
    public void travelStyle() {
        System.out.println("乘坐高鐵。。。");
    }
}
//第三種:使用飛機
public class AirStrategy implements TravelStrategy {
    @Override
    public void travelStyle() {
        System.out.println("乘坐飛機。。。");
    }
}      

第三步:環境類實作

public class Traveler {
    //出行政策接口
    TravelStrategy travelStrategy;
    //設定出行政策
    public void setTravelStrategy(TravelStrategy travelStrategy) {
        this.travelStrategy = travelStrategy;
    }
    //為目前使用者設定出行方式
    public void travelStyle() {
        travelStrategy.travelStyle();
    }

    public static void main(String[] args) {
        Traveler traveler=new Traveler();
           //遊客設定出行政策
        //traveler.setTravelStrategy(new TrainStrategy());
        //traveler.setTravelStrategy(new HighTrainStrategy());
        //traveler.setTravelStrategy(new AirStrategy());
            //遊客出行
       traveler.travelStyle();
    }
}      

三、分析政策模式

1、為什麼要使用政策模式?

政策模式的優點:

  • 我們之前在選擇出行方式的時候,往往會使用if-else語句,也就是使用者不選擇A那麼就選擇B這樣的一種情況,這種情況耦合性太高了,而且代碼臃腫,有了政策模式我們就可以避免這種現象,
  • 政策模式遵循開閉原則,實作代碼的解耦合。擴充新的方法時也比較友善,隻需要繼承政策接口就好了

上面列出的這兩點算是政策模式的優點了,但是不是說他就是完美的,有很多缺點仍然需要我們去掌握和了解,

  • 用戶端必須知道所有的政策類,并自行決定使用哪一個政策類
  • 政策模式會出現很多的政策類
  • context在使用這些政策類的時候,這些政策類由于繼承了政策接口,是以有些資料可能用不到,但是依然初始化了。

2、與其他模式的差別?

(1)與狀态模式的差別

政策模式隻是條件選擇方法,隻執行一次方法,而狀态模式是随着狀态的改變不停地更改執行方法。舉個例子,就好比我們旅遊,對于政策模式我們隻需要選擇其中一種出行方法就好了,但是狀态模式不一樣,可能我們到了A地點選擇的是火車,到了B地點又選擇飛機,根據不同的狀态選擇不同的出行方式。

(2)與工廠模式的差別

工廠模式是建立型模式 ,它關注對象建立,提供建立對象的接口. 讓對象的建立與具體的使用客戶無關。 政策模式是對象行為型模式 ,它關注行為和算法的封裝 。再舉個例子,還是我們出去旅遊,對于政策模式我們隻需要選擇其中一種出行方法就好,但是工廠模式不同,工廠模式是你決定哪種旅行方案後,由工廠代替你去建構具體方案(工廠代替你去買火車票)。

3、使用場景是什麼?