設計模式之策略模式

策略模式:分別封裝行爲(算法)接口,超類裏放行爲(算法)接口,在子類裏賦值具體行爲(算法)對象。
原則:分離變化部分,封裝接口,基於接口編程各種行爲(算法)功能。
作用:此方法讓行爲(算法)的變化獨立於行爲(算法)的使用者。

一 模擬鴨子的遊戲

1、鴨子的抽象類

實現

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 void Fly() {
			System.out.println("~~im fly~~");
		}
	
}

2、鴨子的具體實現類

1)、GreenHeadDuck

public class GreenHeadDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}

	public void Fly() {
		System.out.println("~~no fly~~");
	}
}

2)、RedHeadDuck

public class RedHeadDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**RedHead**");
	}

//	public void Fly() {
//		System.out.println("~~good fly~~");
//	}
}

3)、StoneDuck

public class StoneDuck extends Duck {

	@Override
	public void display() {
		System.out.println("**StoneDuck**");
	}

	public void Quack() {
		System.out.println("~~no gaga~~");
	}
	public void swim() {
		System.out.println("~~no swim~~");
	}
	
	public void Fly() {
		System.out.println("~~no fly~~");
	}
}

3、以上遇到的問題、

當我們要擴展一個行爲的時候,例如fly,
1、使用繼承的時候,fly()的實現放在超類,優點是代碼的複用,缺點是有功能溢出;
2、不使用繼承的時候,fly()在各個子類中實現,缺點是代碼複用性不好;
爲解決以上兩點,就用行爲的組合,不用行爲的繼承;既滿足代碼複用,也滿足不功能溢出。

二、分析問題的方法論

1)、分析問題的變化部分和不變部分,提取變化部分,抽象成接口+實現;
2)、鴨子哪些功能是會根據新需求變化的?叫聲/飛行。。。

例如:
1、接口:
1)、飛行的接口:

public interface FlyBehavior{
void fly();
}

2)、叫聲的接口

public interface QuackBehavior {
void quack();
}

3)好處:新增行爲簡單,行爲類更好的複用,組合更方便。既有繼承帶來的複用好處,沒有挖坑

三、策略模式的實現

1、增加行爲接口的抽象Duck

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 swim() {
		System.out.println("~~im swim~~");
	}

2、行爲接口及具體實現

1)、行爲接口

public interface FlyBehavior {
	void fly();`在這裏插入代碼片`
}

2)、BadFlyBehavior具體行爲

public class BadFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--BadFly--");
	}
}

3)、GoodFlyBehavior具體行爲

public class GoodFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		System.out.println("--GoodFly--");
	}
}

4)、NoFlyBehavior具體行爲

public class NoFlyBehavior implements FlyBehavior
{
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("--NoFly--");
	}
}

3、具體實現的GreenHeadDuck

public class GreenHeadDuck extends Duck {

	public GreenHeadDuck() {
		mFlyBehavior = new GoodFlyBehavior();
		mQuackBehavior = new GaGaQuackBehavior();
	}
	@Override
	public void display() {
		System.out.println("**GreenHead**");
	}
}

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