需求提出
設計兩款鴨子可以發出不同的叫聲行爲
面向對象設計
這裏先定義出超類Duck,寫出共有的行爲方法
public abstract class Duck {
public Duck() {
}
public void Quack() {
System.out.println("~~gaga~~");
}
public abstract void display();
public void swim() {
System.out.println("~~im swim~~");
}
}
在定義出紅頭鴨與綠頭鴨繼承超類即可
public class GreenHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**GreenHead**");
}
}
public class RedHeadDuck extends Duck {
@Override
public void display() {
System.out.println("**RedHead**");
}
}
需求改動
1).紅頭鴨會飛,設計出飛行行爲
2).設計北京烤鴨,他沒有任何行爲
面向對象實現
根據改動1),只需在超類中添加飛行方法即可,但這樣做的隱患是所有的鴨子都會飛,只能覆蓋掉其他鴨子的飛行方法,讓他不會飛。至於改動2),需要重寫所有方法覆蓋。
策略模式
使用策略模式來實現,就可以避免上述的超類改動導致以前的子類代碼需要改動的問題
我們只需將所有行爲定義爲接口即可,並且可以自主改變鴨子的行爲
超類的改動如下
public abstract class Duck {
FlyBehavior mFlyBehavior;
QuackBehavior mQuackBehavior;
public Duck() {
}
public void Fly() {
mFlyBehavior.fly();
}
public void Quack() {
mQuackBehavior.quack();
}
public abstract void display();
public void SetQuackBehavoir(QuackBehavior qb) {
mQuackBehavior = qb;
}
public void SetFlyBehavoir(FlyBehavior fb) {
mFlyBehavior = fb;
}
public void swim() {
System.out.println("~~im swim~~");
}
}
紅頭鴨子改動
public class RedHeadDuck extends Duck {
public RedHeadDuck() {
mFlyBehavior = new BadFlyBehavior();
mQuackBehavior = new GeGeQuackBehavior();
}
@Override
public void display() {
System.out.println("**RedHead**");
}
}
行爲接口
public interface FlyBehavior {
void fly();
}
其中一個實現類
public class BadFlyBehavior implements FlyBehavior {
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("--BadFly--");
}
}
測試方法
public class StimulateDuck {
public static void main(String[] args) {
Duck mRedHeadDuck = new RedHeadDuck();
mRedHeadDuck.display();
mRedHeadDuck.Fly();
mRedHeadDuck.SetFlyBehavoir(new BadFlyBehavior());
mRedHeadDuck.Fly();
}
}
策略模式的作用:就是把具體的算法實現從業務邏輯中剝離出來,成爲一系列獨立算法類,使得它們可以相互替換。