天天看點

設計模式之政策模式政策模式

政策模式

定義:政策模式定義了算法族,分别封裝起來,讓他們之間可以互相替換,此模式讓算法的變化獨立于算法的客戶。

設計模式之政策模式政策模式

如上圖,我們在開發一個Duck類時候,想要實作不同的鴨子類,如綠頭鴨,飛鴨,還有橡皮鴨等,這些鴨子各有各的行為,也有共同的行為。比如許多種鴨子都會叫,有的會飛,有的不會,而不同的鴨子叫的聲音也可能不一樣。如果我們在超類Duck類中定義fly()或者bark()方法,若存在許多子類時,都需要重新實作這些方法。可以想到需要重寫這些方法很多遍。是以應該減少這些方法的實作,不然程式在以後的維護和擴充時,需要修改大量的代碼。

如果采用上圖的政策模式,将鴨子的行為想成一族算法,算法代表鴨子能做的事情,對每個算法(即鴨子的行為)用一個接口來描述行為(如叫),而對不同的叫聲,我們使用不同類來實作這個接口。這樣不管以後需要增加什麼樣的聲音隻需要增加一個類來實作這個接口就可以了,而不用修改别的代碼。當然,我們需要再超類Duck類中定義一個對應的接口變量(組合的思想)。例如我們為飛行行為定義了Flybehavior接口(内聲明一個fly()),每個實作該接口的類都重寫了自己特定的fly()方法。

Flybehavior flyBehavior;           

由于duck的子類都繼承了flyBehavior變量,是以子類可以友善的利用flyBehavior變量調用不同的fly方法。隻需将不同的實作該接口的類對象指派給flyBehavior變量即可。flyBehavior.fly()就可以調用相應對象的fly()方法。

但是我們如何在程式執行過程中,動态的改變鴨子的行為呢。

我們可以通過這樣實作:

首先在,duck類中加入2個新方法:

public void setFlyBehavior(FlyBehavior fb){
    flyBehavior=fb;
    }

public void performFly(){
    flyBehavior.fly();           

通過這樣我們隻需使用duck類的執行個體,對flyBehavior變量賦一不同的接口實作類,就可以通過performFly()實作不同的行為。

繼續閱讀