設計模式筆記 策略模式

2021-07-09 10:37:37 字數 3339 閱讀 2591

常用設計模式有23中,分為:

建立型模式(主要用於建立物件)

1、單例模式

2、工廠方法模式

3、抽象工廠模式

4、建造者模式

5、原型模式

行為型模式 (主要用於描述物件或類是怎樣互動和怎樣分配職責)

1、模板方法模式

2、中介者模式

3、命令模式

4、責任鏈模式

5、策略模式

6、迭代器模式

7、觀察者模式

8、備忘錄模式

9、訪問者模式 

10、狀態模式

11、直譯器模式

結構型模式(主要用於處理類或物件的組合)

1、**模式

2、裝飾模式

3、介面卡模式

4、組合模式

5、外觀模式(門面模式)

6、享元模式

7、橋梁模式

策略模式

策略模式(strategy pattern)是一種比較簡單的模式,也叫做政策模式(policy

pattern)。其定義如下:

定義一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換。

策略模式使用的就是物件導向的繼承和多型機制, 策略模式的三個角色:

● context封裝角色

它也叫做上下文角色,起承上啟下封裝作用,遮蔽高層模組對策略、演算法的直接訪問,封裝可能存在的變化。

● strategy抽象策略角色

策略、演算法家族的抽象,通常為介面,定義每個策略或演算法必須具有的方法和屬性。

各位看官可能要問了,類圖中的

algorithminte***ce是什麼意思?

algorithm是

「運算法則

」的意思,結合起來意思就明白了吧。

● concretestrategy具體策略角色

實現抽象策略中的操作,該類含有具體的演算法。

策略模式的通用原始碼

先看抽象策略角色,它是乙個非常普通的介面,定義乙個或多個具體的演算法,

如**清單

18-7所示。

**清單18-7 抽象的策略角色

public inte***ce strategy

具體策略也是非常普通的乙個實現類,只要實現介面中的方法就可以,如**清單18-8

所示。

**清單18-8 具體策略角色

public class concretestrategy1 implements strategy
}public class concretestrategy2 implements strategy 

}

策略模式的重點就是封裝角色,它是借用了**模式的思路,

大家可以想想,它和**模式有什麼差別,差別就是策略模式的封裝角色和被封裝的策略類不用是同乙個介面,如果

是同乙個介面那就成為了**模式。

我們來看封裝角色,如**清單

18-9所示。

**清單18-9 封裝角色

public class context

//封裝後的策略方法

public void doanythinig()

}

高層模組的呼叫非常簡單,知道要用哪個策略,產生出它的物件,然後放到封裝角色中就完成任務了,如**清單

18-10所示。

**清單18-10 高層模組

public class client

}

策略模式就是這麼簡單,它就是採用了物件導向的繼承和多型機制,其他沒什麼玄機。

想想看,你真實的業務環境有這麼簡單嗎?乙個類實現多個介面很正常,你要有

火眼金睛看清楚哪個介面是抽象策略介面,哪些是和策略模式沒有任何關係,這就是你作為系統分析師的價值所在。

優點 ● 演算法可以自由切換

通過封裝角色對其進行封裝,保證對外提供「可自由切換」的策略。

● 避免使用多重條件判斷

簡化了操作,同時避免了條件語句判斷  

● 擴充套件性良好  缺點

● 策略類數量增多

● 所有的策略類都需要對外暴露

上層模組必須知道有哪些策略,然後才能決定使用哪乙個策略,這與迪公尺特法則是相違

背的,我只是想使用了乙個策略,我憑什麼就要了解這個策略呢?那要你的封裝類還有什麼

意義?這是原裝策略模式的乙個缺點,幸運的是,我們可以使用其他模式來修正這個缺陷,

如工廠方法模式、**模式或享元模式。

使用場景

● 多個類只有在演算法或行為上稍有不同的場景。

● 演算法需要自由切換的場景。

● 需要遮蔽演算法規則的場景。 

注意事項

如果系統中的乙個策略家族的具體策略數量超過4個,則需要考慮使用混合模式,解決策略類膨脹和對外暴露的問題,否則日後的系統維護就會成為乙個燙手山芋

策略列舉

把原有定義在抽象策略中的方法移植到列舉中,每個列舉成員就成為乙個具體策略

**清單18-18 策略列舉

public enum calculator

},//減法運算

sub("-")

};string value = "";

//定義成員值型別

private calculator(string _value)

//獲得列舉成員的值

public string getvalue()

//宣告乙個抽象函式

public abstract int exec(int a,int b);

}

場景類稍有改動  

**清單18-19 場景類

public class client

}

注意策略列舉是乙個非常優秀和方便的模式,但是它受列舉型別的限制,每個列舉項

都是public、

final、

static的,擴充套件性受到了一定的約束,因此在系統開發中,策略列舉一般

擔當不經常發生變化的角色。

策略模式是乙個非常簡單的模式。它在專案中使用得非常多,但它單獨使用的地方就比較少了,因為它有致命缺陷:所有的策略都需要暴露出去,這樣才方便客戶端決定使用哪一

個策略  

設計模式筆記 策略模式

策略模式 strategy 定義了一組演算法,將每個演算法都封裝起來,並且使它們之間可以互換,在使用時,根據傳入的型別不同,隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法 策略模式和簡單工廠模式的區別 工廠是建立型模式,它的作用就是建立物件,簡單工廠模...

設計模式筆記(三) 策略模式

策略模式 定義的演算法家族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義一種演算法的方法,從概念上看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有演算法,減少了各種演算法類與使用演算法類之間的耦合。優點 第...

設計模式學習筆記 策略模式

我覺得策略模式與工廠方法模式極其相似!策略模式 工廠方法模式 如果單從圖來看,看不出有何相似之處。但看看呼叫方法就知道了 策略模式 context context new context abstractstrategy strategy 採用哪種策略,由呼叫方決定 strategy new con...