Head First 設計模式之策略模式
設計原則:找出應用可能需要變化之處,把它們獨立出來,不要和那個不需要變化的代碼放在一起.設計原則:多用組合,少用繼承.
設計原則:針對接口編程,而不是針對實現編程.
背景:需要設計一個鴨子類,有飛行和呱呱叫兩種行為.可是后來引入了橡皮鴨,導致傳統的繼承處理無法使用(不能讓橡皮鴨也會飛)而且還可能會有既不會飛也不會叫的鴨子,或者需要引入不同種鴨子的具體的飛行運行,叫的聲音......
策略模式:把易變的動作部分抽象出來成為單獨的類(接口).
定義:定義了算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶.
public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck(){
}
public 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 FlyWithWings implements FlyBehavior{
public void fly() {
System.out.println("I'm flying!!");
}
}
public void quack();
}
public class Quack implements QuackBehavior{
public void quack() {
System.out.println("Quack");
}
}
public class muteQuack implements QuackBehavior{
public void quack() {
System.out.println("<<Silence>>");
}
}
public class Squeak implements QuackBehavior{
public void quack() {
System.out.println("Squeak");
}
}
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I'm a real Mallard duck.");
}
}
測試類:
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
}
}