設計模式筆記---策略模式(2013.3.25)


定義:

策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。

Context(應用場景):

  1、需要使用ConcreteStrategy提供的算法。

  2、內部維護一個Strategy的實例。

  3、負責動態設置運行時Strategy具體的實現算法。

  4、負責跟Strategy之間的交互和數據傳遞。

Strategy(抽象策略類)

    1、定義了一個公共接口,各種不同的算法以不同的方式實現這個接口,Context使用這個接口調用不同的算法,一般使用接口或抽象類實現。

ConcreteStrategy(具體策略類)

  1、 實現了Strategy定義的接口,提供具體的算法實現。

UML類圖

 

優點

1、 提供了一種替代繼承的方法,而且既保持了繼承的優點(代碼重用)還比繼承更靈活(算法獨立,可以任意擴展)。

2、 避免程序中使用多重條件轉移語句,使系統更靈活,並易於擴展。

3、 遵守大部分GRASP原則和常用設計原則,高內聚、低偶合。

缺點

1、因爲每個具體策略類都會產生一個新類,所以會增加系統需要維護的類的數量。

 

使用場景

  1、 多個類只區別在表現行爲不同,可以使用Strategy模式,在運行時動態選擇具體要執行的行爲。

  2、 需要在不同情況下使用不同的策略(算法),或者策略還可能在未來用其它方式來實現。

  3、 對客戶隱藏具體策略(算法)的實現細節,彼此完全獨立。

示列

 

1、定義接口(Strategy類),用於支持算法的公共接口
interface Strategy { 
    public void AlgorithmInterface();
}
2、Context類,用於ConcreteStrategy來配置,維護一個對Strategy對象的引用
    class Context
{
	Strategy strategy;
     public Context(Strategy strategy){//初始化時,傳入具體的策略對象
	this. Strategy = strategy;
}
public void ContextInterface(){//根據具體的策略對象,調用其算法的方法
	Strategy.AlgorithmInterface();
}
}
3、測試代碼
public static void main(String[] args) { 
Context context;
     context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();

}

4、ConcreteStrategy類,封裝具體的算法和行爲,繼承Strategy


Class ConcreteStrategyA extends Strategy{//具體的策略算法實現
	@Override
    public void AlgorithmInterface(){
		System.out.println(“算法A的實現”);
}
}

Class ConcreteStrategyAB extends Strategy{//具體的策略算法實現
	@Override
    public void AlgorithmInterface(){
		System.out.println(“算法B的實現”);
}
}

Class ConcreteStrategyC extends Strategy{//具體的策略算法實現
	@Override
    public void AlgorithmInterface(){
		System.out.println(“算法C的實現”);
}
}


發佈了54 篇原創文章 · 獲贊 61 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章