策略模式定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
個人理解:策略模式就是把父類中需要根據不同情況而變化的行為想成“一族算法”,并把它抽象出來變成兩個接口,在父類中包含這個接口類型的屬性,這樣就可以利用不同的接口實現類來改變這個行為。并且添加了getter,setter方法后可以在運行時隨意改變行為的實現,這樣就可以使我們的設計更加富有彈性,可以使我們的設計更加易于維護和擴展。
實例代碼:
要求:所有的各類鴨子繼承一個超類,并且可以擁有自己的特性,可以因為需求變化而改變某個鴨子或某一類鴨子的某種特性(如可以改變叫聲和飛行狀態)。
//鴨子超類
public abstract class Duck {
//飛行狀態算法族
FlyBehavior flyBehavior;
//鳴叫狀態算法族
QuackBehavior quackBehavior;
public Duck() {
}
//改變算法組狀態的方法,可是在運行時改變特性的方法
public void setFlyBehavior (FlyBehavior fb) {
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
quackBehavior = qb;
}
//由子類繼承并實現的鴨子特性(不會改變)
abstract void display();
//由子類繼承的飛行和鳴叫方法
public void performFly() {
flyBehavior.fly();
}
public void performQuack() {
quackBehavior.quack();
}
public void swim() {
System.out.println("All ducks float, even decoys!");
}
}
//飛行接口
public interface FlyBehavior {
public void fly();
}
//飛行狀態實現類(不能飛)
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly");
}
}
//火箭助推器
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm flying with a rocket");
}
}
//鳴叫接口
public interface QuackBehavior {
public void quack();
}
//鳴叫狀態實現類(不能叫)
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< Silence >>");
}
}
//一個模型鴨的子類,在創建時指定特性
public class DecoyDuck extends Duck {
//在構造器中指定飛行特性和鳴叫特性(不能飛,不能叫)
public DecoyDuck() {
setFlyBehavior(new FlyNoWay());
setQuackBehavior(new MuteQuack());
}
public void display() {
System.out.println("I'm a duck Decoy");
}
}
//測試程序
public class MiniDuckSimulator {
public static void main(String[] args) {
DecoyDuck decoy = new DecoyDuck();
decoy.performQuack();
decoy .performFly();
//運行時把飛行狀態改為火箭助推器飛行
decoy .setFlyBehavior(new FlyRocketPowered());
decoy .performFly();
}
}