定義
策略模式定義了算法族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用算法的客戶。
實際例子
在Head First 設(shè)計模式的開篇就講了一個策略模式的例子。
要實現(xiàn)一組鴨子類,每種鴨子類可能有不同的叫聲、外形和飛行方式。
將鴨子作為一個抽象父類,同時定義叫聲接口,外形接口,飛行接口。并對每一種叫聲、外形、飛行方式都有一個具體的實現(xiàn)類(實現(xiàn)對應(yīng)接口)。而在鴨子類中持有叫聲、外形和飛行方式三個接口類型的成員變量。
對于具體的一種鴨子,在構(gòu)造方法里使用不同的行為實現(xiàn)類對叫聲、外形和飛行方式進行初始化。
具體代碼:(在三個行為中只包括叫聲接口)
//鴨子父類
public abstract class Duck {
private FlyBehavior flyBehavior;
public void performFly() {
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
}
//飛行接口
public interface FlyBehavior {
void fly();
}
//飛行實現(xiàn)類
public class FlyWithWing implements FlyBehavior {
@Override
public void fly() {
System.out.println("fly with wing!");
}
}
//具體鴨子類
public class BigDuck extends Duck {
public BigDuck() {
setFlyBehavior(new FlyWithWing());
}
public static void main(String[] args) {
Duck duck = new BigDuck();
duck.performFly();
}
}
設(shè)計模式原則總結(jié)1
- 封裝變化
- 多用組合,少用繼承
- 針對接口而不是實現(xiàn)編程