Java設計模式--策略模式

1.策略模式

1.1定義

策略模式:定義了算法族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。算法

1.2 底層機制

將有共性的行爲抽象爲一個接口,其中有此種行爲的聲明。該接口的實現類都實現了這個行爲,可是提供了不一樣的行爲表現。在執行此類行爲的類中含有該接口的引用,在執行行爲前要肯定該行爲的表現,選擇適合的執行。編程

1.3體現的設計原則

一、把會變化的部分取出並「封裝」起來,好讓其餘部分不會受到影響。設計模式

二、針對接口編程,而不是針對實現編程。工具

三、多用組合,少用繼承。測試

1.4優缺點

優勢:spa

一、能夠避免代碼重複。設計

二、擴展性良好。在添加新的行爲時,不用修改寫好的代碼。orm

三、算法能夠自由切換。blog

缺點:繼承

一、策略模式只適用於客戶端知道全部的算法或行爲的狀況。

二、策略模式形成不少策略類,每一個具體策略類都會產生一個新類。

1.5案例:模擬鴨子游戲

1.5.1類圖

1.5.2 代碼邏輯

一、取出易於變化的部分,將其封裝成類,創建一組新的類來表示每一個行爲。首先,在Duck類中「加入兩個實例變量」,分別爲「FlyBehavior」與「QuackBehavior」,聲明成接口類型(不是具體的實現類型)。

二、Duck類中實現「performFly()」與「performQuack()」,在這個方法中鴨子不會親自處理飛和呱呱叫的行爲,而是委託給行爲類處理。

三、實現具體類型的鴨子類。

四、編寫測試類。

1.5.3代碼實現

一、實現「飛」和「叫」行爲的封裝,定義成接口類型。

     public interface FlyBehavior {

public void fly();

   }

 

  public interface QuackBehavior {

   public void quack();

   }

二、實現鴨子類,定義成抽象類。(經過set方法動態設置鴨子的行爲)

public abstract class Duck {

FlyBehavior flyBehavior;

QuackBehavior quackBehavior;

 

abstract void display();

 

public Duck() {

}

public void setFlyBehavior(FlyBehavior fb) {

flyBehavior = fb;

}

public void setQuackBehavior(QuackBehavior qb) {

quackBehavior = qb;

}

public void performFly() {

flyBehavior.fly();

}

public void performQuack() {

quackBehavior.quack();

}

public void swim() {

System.out.println("All ducks float, even decoys!");

}

}

三、編寫具體的行爲。

       全部飛行行爲類

public class FlyWithWings implements FlyBehavior {

public void fly() {

System.out.println("I'm flying!!");

}

}

 

public class FlyNoWay implements FlyBehavior {

public void fly() {

System.out.println("I can't fly");

}

}

   全部叫的行爲類

public class Quack implements QuackBehavior {

public void quack() {

System.out.println("Quack");

}

}

 

public class Squeak implements QuackBehavior {

public void quack() {

System.out.println("Squeak");

}

}

 

public class MuteQuack implements QuackBehavior {

public void quack() {

System.out.println("<< Silence >>");

}

}

四、創建一個新的鴨子類:

public class ModelDuck extends Duck {

public ModelDuck() {

flyBehavior = new FlyNoWay();

quackBehavior = new Quack();

}

public void display() {

System.out.println("I'm a model duck");

}

}

 

五、添加一個新的飛行類型。

public class FlyRocketPowered implements FlyBehavior {

public void fly() {

System.out.println("I'm flying with a rocket");

}

}

六、編寫測試類

public class MiniDuckSimulator1 {

 

public static void main(String[] args) {

 

Duck model = new ModelDuck();

model.performQuack();

model.performFly();

model.setFlyBehavior(new FlyRocketPowered());

model.performFly();

}

   }

 

七、

 
   

運行結果

1.6思惟拓展

一、設計模式的基礎包括:抽象、封裝、多態、繼承。

二、MQ

三、WEBSERIVE

1.7應用場景

一、在一個系統種多個類之間的區別僅在於他們的行爲不一樣。

二、須要在不一樣狀況下使用不用的策略(算法),或者策略還可能在將來用其餘方式來實現。

三、對客戶隱藏具體策略算法的細節,實現彼此徹底獨立。

1.8應用實例

1、諸葛亮的錦囊妙計,每個錦囊就是一個策略。

2、旅行的出遊方式,選擇不一樣的出行工具,每一種旅行方式都是一個策略

1.9注意事項

一、若是一個系統的策略多於四個,就考慮使用混合模式,解決策略類膨脹的問題。

相關文章
相關標籤/搜索