策略模式:定義了算法族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。算法
將有共性的行爲抽象爲一個接口,其中有此種行爲的聲明。該接口的實現類都實現了這個行爲,可是提供了不一樣的行爲表現。在執行此類行爲的類中含有該接口的引用,在執行行爲前要肯定該行爲的表現,選擇適合的執行。編程
一、把會變化的部分取出並「封裝」起來,好讓其餘部分不會受到影響。設計模式
二、針對接口編程,而不是針對實現編程。工具
三、多用組合,少用繼承。測試
優勢:spa
一、能夠避免代碼重複。設計
二、擴展性良好。在添加新的行爲時,不用修改寫好的代碼。orm
三、算法能夠自由切換。blog
缺點:繼承
一、策略模式只適用於客戶端知道全部的算法或行爲的狀況。
二、策略模式形成不少策略類,每一個具體策略類都會產生一個新類。
一、取出易於變化的部分,將其封裝成類,創建一組新的類來表示每一個行爲。首先,在Duck類中「加入兩個實例變量」,分別爲「FlyBehavior」與「QuackBehavior」,聲明成接口類型(不是具體的實現類型)。
二、在Duck類中實現「performFly()」與「performQuack()」,在這個方法中鴨子不會親自處理飛和呱呱叫的行爲,而是委託給行爲類處理。
三、實現具體類型的鴨子類。
四、編寫測試類。
一、實現「飛」和「叫」行爲的封裝,定義成接口類型。
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();
}
}
七、
運行結果
一、設計模式的基礎包括:抽象、封裝、多態、繼承。
二、MQ
三、WEBSERIVE
一、在一個系統種多個類之間的區別僅在於他們的行爲不一樣。
二、須要在不一樣狀況下使用不用的策略(算法),或者策略還可能在將來用其餘方式來實現。
三、對客戶隱藏具體策略算法的細節,實現彼此徹底獨立。
1、諸葛亮的錦囊妙計,每個錦囊就是一個策略。
2、旅行的出遊方式,選擇不一樣的出行工具,每一種旅行方式都是一個策略
一、若是一個系統的策略多於四個,就考慮使用混合模式,解決策略類膨脹的問題。