1. 程式人生 > >設計模式之策略模式:模擬鴨子

設計模式之策略模式:模擬鴨子

package firstPro;
/*headfirst 設計模式第一章節 策略模式,模擬鴨子游戲,由於鴨子的顏色種類固定,不經常變動,所以把顏色相關函式放在超類Duck中,由於
  鴨子的fly和kua兩個行為經常要變更,或者增加新的表現行為,大致先用以下兩種方案:
 方案一:如果把該行為也放在Duck超類,以後每新增一個新行為,則所有子類都會繼承該行為,包括那些不想新增該行為的子類,牽一髮而動全身
 方案二:如果把該行為分別寫在每一個鴨子子類中(如GreenDuck)則每一個子類都要單獨寫一個行為實現方法,而這些方法是有重複的,比如兩
 種鴨子的飛行方式一樣,但是要寫兩次。
 所以出現方案三,也就是策略模式,把經常發生變化(增加或者刪除)的行為單獨放在另一個分支,通過把鴨子的行為與鴨子分開,形成演算法簇
設計模式原則:多用組合,少用繼承
 */

abstract class Duck		//超類鴨子類,甭管什麼鴨子都要從這裡繼承鴨子屬性和方法
{
	FlyBehave flybehave;
	KuaBehave kuabehave;
	abstract public void display();	//抽象方法,所有子類必須提供該方法具體實現,因為鴨子的外貌必須要有
	public void setFly(FlyBehave flybehavior)	//給外部提供一個介面可以實現動態改變flybehave的值,也就是動態改變鴨子飛行行為
	{
		this.flybehave = flybehavior;	//這裡用到了多型,在執行時動態的改變鴨子行為
	}
	public void performFly()	//表現鴨子飛行的特徵,這裡用到了
	{
		this.flybehave.Fly();	//同樣用到了多型,動態的根據鴨子飛行方式的型別來表現飛行特徵
	}
	
	public void setKua(KuaBehave kuabehavior)	//給外部提供一個介面可以實現動態改變kuabehave的值,也就是動態改變鴨子叫的行為
	{
		this.kuabehave = kuabehavior;
	}
	public void performKua()
	{
		this.kuabehave.Kua();
	}
	
}

class GreenDuck extends Duck	//建立一個稍微具體的鴨子型別,繼承自超類Duck,名綠鴨子
{
	public GreenDuck()	//在建構函式內部一定要實現鴨子飛行行為與叫的行為,否則該鴨子例項化後就沒有指定行為
	{
		this.flybehave = new FlyWithWings();	//指定綠鴨子用翅膀 飛
		this.kuabehave = new Qiqi();	//指定綠鴨子唧唧叫
	}
	public void display()
	{
		System.out.println("im a green duck");	//指定綠鴨子的外觀為一個綠色的鴨子
	}
}

interface FlyBehave		//關於鴨子飛行行為的介面,實現該接口才可實現具體飛行行為
{
	public void Fly();	//介面宣告一個鴨子飛行行為的函式
}
class FlyWithWings implements FlyBehave	//該類實現了鴨子飛行的一個行為,用翅膀飛行
{
	public void Fly()
	{
		System.out.println("im flying with wings");
	}
}
class NoFly implements FlyBehave	//該類實現了鴨子飛行的一個行為,不會飛
{
	public void Fly()
	{
		System.out.println("i can't fly");
	}
}
interface KuaBehave	//關於鴨子叫的介面,實現該接口才可實現具體叫的行為
{
	public void Kua();
}

class Qiqi implements KuaBehave	//該類實現了鴨子叫的一個行為,唧唧叫
{
	public void Kua()
	{
		System.out.println("i make sound with qiqi");
	}
}

class Kuakua implements KuaBehave	//該類實現了鴨子叫的一個行為,呱呱叫
{
	public void Kua()
	{
		System.out.println("i make sound with kuakua");
	}
}

class NoKua implements KuaBehave	////該類實現了鴨子叫的一個行為,不會叫
{
	public void Kua()
	{
		System.out.println("i can't make sound");
	}
}

class CHello
{
	public static void  main(String[] args)
	{
		Duck greenduck = new GreenDuck();	//例項化一個綠鴨子
		greenduck.display();	//展現鴨子的外觀
		greenduck.performFly();		//鴨子展現下飛行方式
		greenduck.setFly(new NoFly());	//設定鴨子的飛行方式為不會飛
		greenduck.performFly();	//再次展現鴨子飛行方式,結果是不會飛
	}
}