設計模式之策略模式:模擬鴨子
阿新 • • 發佈:2019-02-15
package firstPro; /*headfirst 設計模式第一章節 策略模式,模擬鴨子游戲,由於鴨子的顏色種類固定,不經常變動,所以把顏色相關函式放在超類Duck中,由於 鴨子的fly和kua兩個行為經常要變更,或者增加新的表現行為,大致先用以下兩種方案: 方案一:如果把該行為也放在Duck超類,以後每新增一個新行為,則所有子類都會繼承該行為,包括那些不想新增該行為的子類,牽一髮而動全身 方案二:如果把該行為分別寫在每一個鴨子子類中(如GreenDuck)則每一個子類都要單獨寫一個行為實現方法,而這些方法是有重複的,比如兩 種鴨子的飛行方式一樣,但是要寫兩次。 所以出現方案三,也就是策略模式,把經常發生變化(增加或者刪除)的行為單獨放在另一個分支,通過把鴨子的行為與鴨子分開,形成演算法簇
設計模式原則:多用組合,少用繼承 */ abstract class Duck //超類鴨子類,甭管什麼鴨子都要從這裡繼承鴨子屬性和方法 { FlyBehave flybehave; KuaBehave kuabehave; abstract public void display(); //抽象方法,所有子類必須提供該方法具體實現,因為鴨子的外貌必須要有 public void setFly(FlyBehave flybehavior) //給外部提供一個介面可以實現動態改變flybehave的值,也就是動態改變鴨子飛行行為 { this.flybehave = flybehavior; //這裡用到了多型,在執行時動態的改變鴨子行為 } public void performFly() //表現鴨子飛行的特徵,這裡用到了 { this.flybehave.Fly(); //同樣用到了多型,動態的根據鴨子飛行方式的型別來表現飛行特徵 } public void setKua(KuaBehave kuabehavior) //給外部提供一個介面可以實現動態改變kuabehave的值,也就是動態改變鴨子叫的行為 { this.kuabehave = kuabehavior; } public void performKua() { this.kuabehave.Kua(); } } class GreenDuck extends Duck //建立一個稍微具體的鴨子型別,繼承自超類Duck,名綠鴨子 { public GreenDuck() //在建構函式內部一定要實現鴨子飛行行為與叫的行為,否則該鴨子例項化後就沒有指定行為 { this.flybehave = new FlyWithWings(); //指定綠鴨子用翅膀 飛 this.kuabehave = new Qiqi(); //指定綠鴨子唧唧叫 } public void display() { System.out.println("im a green duck"); //指定綠鴨子的外觀為一個綠色的鴨子 } } interface FlyBehave //關於鴨子飛行行為的介面,實現該接口才可實現具體飛行行為 { public void Fly(); //介面宣告一個鴨子飛行行為的函式 } class FlyWithWings implements FlyBehave //該類實現了鴨子飛行的一個行為,用翅膀飛行 { public void Fly() { System.out.println("im flying with wings"); } } class NoFly implements FlyBehave //該類實現了鴨子飛行的一個行為,不會飛 { public void Fly() { System.out.println("i can't fly"); } } interface KuaBehave //關於鴨子叫的介面,實現該接口才可實現具體叫的行為 { public void Kua(); } class Qiqi implements KuaBehave //該類實現了鴨子叫的一個行為,唧唧叫 { public void Kua() { System.out.println("i make sound with qiqi"); } } class Kuakua implements KuaBehave //該類實現了鴨子叫的一個行為,呱呱叫 { public void Kua() { System.out.println("i make sound with kuakua"); } } class NoKua implements KuaBehave ////該類實現了鴨子叫的一個行為,不會叫 { public void Kua() { System.out.println("i can't make sound"); } } class CHello { public static void main(String[] args) { Duck greenduck = new GreenDuck(); //例項化一個綠鴨子 greenduck.display(); //展現鴨子的外觀 greenduck.performFly(); //鴨子展現下飛行方式 greenduck.setFly(new NoFly()); //設定鴨子的飛行方式為不會飛 greenduck.performFly(); //再次展現鴨子飛行方式,結果是不會飛 } }