設計模式:策略模式

定義

策略模式是一種比較簡單的模式:定義一組算法,將每個算法封裝起來,並且使他們之間可以互換。

策略模式的通用類圖:


策略模式使用的是面向對象的繼承和多態機制,非常容易理解和掌握,
  • Context封裝角色
也叫上下文角色,起承上啓下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。
  • Strategy抽象策略角色
策略、算法的抽象,通常爲接口,定義每個策略或算法必須具有的方法和屬性。
  • ConcreteStrategy具體策略角色
實現抽象策略中的操作,該類包含具體的算法


通用代碼實現

抽象的策略角色
public interface Strategy {
        //策略模式的運算法則
        public void doSomething();
}


具體策略角色
public class ConcreteStrategy implements Strategy {
        public void doSomething() {
            System.out.println("");
        }
}


封裝角色
策略模式的重點是封裝角色,它是借用了代理模式的思路,差別就是策略模式的封裝角色和被封裝的策略不用是同一個接口,如果是同一個接口那就成爲代理模式了。

public class Context {
	//抽象策略
	private Strategy strategy = NULL;
	//構造函數設置具體策略
	public Context(Strategy strategy) {
		this.strategy = strategy;
	}
	//封裝後的策略方法
	public void doAnything(){
		this.strategy.doSomething();
	}
}



高層模塊調用非常簡單,知道用哪個策略,產生它的對象,然後放到封裝角色中就完成任務了。

策略模式的應用

優點
  • 算法可以自由的切換:
只要實現抽象策略,它就成爲策略家族中的一個成員,通過封裝角色對其進行封裝,保證對外提供可自由切換的策略。
  • 避免使用多重條件判斷:
如果沒有策略模式,一會要使用A策略一會要使用B策略,怎麼設計?使用多重的條件語句?多重條件語句不易維護,而且出錯的概率大大增加。使用策略模式後,可以由其他模塊決定使用何種策略
  • 擴展性良好
缺點
  • 策略類數量增多:每一個策略一個類,複用的可能性很小
  • 所有的策略類都需要對外暴露
使用場景
  • 多個類只有在算法或行爲上稍有不同的場景
  • 算法需要自由切換








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