策略模式

需求提出

設計兩款鴨子可以發出不同的叫聲行爲

面向對象設計

這裏先定義出超類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();
	}
}

策略模式的作用:就是把具體的算法實現從業務邏輯中剝離出來,成爲一系列獨立算法類,使得它們可以相互替換。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章