設計模式-策略模式

策略模式

策略模式使開發人員能夠開發出由許多可替換的部分組成的軟件,並且各個部分之間是弱連接的關係,弱連接的特性使軟件具有更強的可擴展性,易於維護;更重要的是,它大大提高了軟件的可重用性。

定義

–定義一組算法,將每個使它們之間可以互換。

–策略模式使這些算法在能夠互不影響地變化

組成

環境(Context)角色:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行爲。

實現

–策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。
–策略模式使得算法可以在不影響到客戶端的情況下發生變化。使用策略模式可以把行爲和環境分割開來。
–環境類負責維持和查詢行爲類,各種算法則在具體策略中提供。由於算法和環境獨立開來,算法的修改都不會影響環境和客戶端

步驟

1)對策略對象定義一個公共接口。
2)編寫策略類,該類實現了上面的公共接口
3)在使用策略對象的類中保存一個對策略對象的引用。
4)在使用策略對象的類中,實現對策略對象的set和get方法(注入)或者使用構造方法完成賦值

實例

抽象策略角色
public interface IActive {
	
	public void doActive();

}

具體策略角色
public class Jump implements IActive {

	@Override
	public void doActive() {
		System.out.println(" ==jump== ");
	}

}

public class Run implements IActive {

	@Override
	public void doActive() {
		System.out.println(" ==run== ");
	}

}

環境角色
public class People {
	
	private IActive active;
	
	public People(IActive active){
		this.active = active;
	}

	public void doActive(){
		this.active.doActive();
	}

	public IActive getActive() {
		return active;
	}

	public void setActive(IActive active) {
		this.active = active;
	}
	
}

客戶端
public class Client {
	public static void main(String[] args) {
		//具體角色
		IActive active = new Run();
		//創建環境
		People people = new People(active);
		people.doActive();//run
		
		people.setActive(new Jump());
		people.doActive();//jump
	}

}

策略模式的優缺點

策略模式的優點
1)策略模式提供了管理相關的算法族的辦法。策略類的等級結構定義了一個算法或行爲族。恰當使用繼承可以把公共的代碼移到父類裏面,從而避免代碼重複。
2)使用策略模式可以避免使用多重條件(if-else)語句。多重條件語句不易維護,它把採取哪一種算法或採取哪一種行爲的邏輯與算法或行爲的邏輯混合在一起,統統列在一個多重條件語句裏面,比使用繼承的辦法還要原始和落後。
策略模式的缺點
1)客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這就意味着客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用於客戶端知道算法或行爲的情況。
2)由於策略模式把每個具體的策略實現都單獨封裝成爲類,如果備選的策略很多的話,那麼對象的數目就會很可觀。




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