演算法的封裝與切換——策略模式(二)
24.2 策略模式概述
在策略模式中,我們可以定義一些獨立的類來封裝不同的演算法,每一個類封裝一種具體的演算法,在這裡,每一個封裝演算法的類我們都可以稱之為一種策略(Strategy),為了保證這些策略在使用時具有一致性,一般會提供一個抽象的策略類來做規則的定義,而每種演算法則對應於一個具體策略類。
策略模式的主要目的是將演算法的定義與使用分開,也就是將演算法的行為和環境分開,將演算法的定義放在專門的策略類中,每一個策略類封裝了一種實現演算法,使用演算法的環境類針對抽象策略類進行程式設計,符合“依賴倒轉原則”。在出現新的演算法時,只需要增加一個新的實現了抽象策略類的具體策略類即可。策略模式定義如下:
策略模式(Strategy Pattern):定義一系列演算法類,將每一個演算法封裝起來,並讓它們可以相互替換,策略模式讓演算法獨立於使用它的客戶而變化,也稱為政策模式(Policy)。策略模式是一種物件行為型模式。 |
策略模式結構並不複雜,但我們需要理解其中環境類Context的作用,其結構如圖24-1所示:
在策略模式結構圖中包含如下幾個角色:
● Context(環境類):環境類是使用演算法的角色,它在解決某個問題(即實現某個方法)時可以採用多種策略。在環境類中維持一個對抽象策略類的引用例項,用於定義所採用的策略。
● Strategy(抽象策略類):它為所支援的演算法宣告瞭抽象方法,是所有策略類的父類,它可以是抽象類或具體類,也可以是介面。環境類通過抽象策略類中宣告的方法在執行時呼叫具體策略類中實現的演算法。
● ConcreteStrategy(具體策略類):它實現了在抽象策略類中宣告的演算法,在執行時,具體策略類將覆蓋在環境類中定義的抽象策略類物件,使用一種具體的演算法實現某個業務處理。
|
策略模式是一個比較容易理解和使用的設計模式,策略模式是對演算法的封裝,它把演算法的責任和演算法本身分割開,委派給不同的物件管理。策略模式通常把一個系列的演算法封裝到一系列具體策略類裡面,作為抽象策略類的子類。在策略模式中,對環境類和抽象策略類的理解非常重要,環境類是需要使用演算法的類。在一個系統中可以存在多個環境類,它們可能需要重用一些相同的演算法。
在使用策略模式時,我們需要將演算法從Context類中提取出來,首先應該建立一個抽象策略類,其典型程式碼如下所示:
abstract class AbstractStrategy {
public abstract void algorithm(); //宣告抽象演算法
}
然後再將封裝每一種具體演算法的類作為該抽象策略類的子類,如下程式碼所示:
class ConcreteStrategyA extends AbstractStrategy {
//演算法的具體實現
public void algorithm() {
//演算法A
}
}
其他具體策略類與之類似,對於Context類而言,在它與抽象策略類之間建立一個關聯關係,其典型程式碼如下所示:
class Context {
private AbstractStrategy strategy; //維持一個對抽象策略類的引用
public void setStrategy(AbstractStrategy strategy) {
this.strategy= strategy;
}
//呼叫策略類中的演算法
public void algorithm() {
strategy.algorithm();
}
}
在Context類中定義一個AbstractStrategy型別的物件strategy,通過注入的方式在客戶端傳入一個具體策略物件,客戶端程式碼片段如下所示:
……
Context context = new Context();
AbstractStrategy strategy;
strategy = new ConcreteStrategyA(); //可在執行時指定型別
context.setStrategy(strategy);
context.algorithm();
……
在客戶端程式碼中只需注入一個具體策略物件,可以將具體策略類類名儲存在配置檔案中,通過反射來動態建立具體策略物件,從而使得使用者可以靈活地更換具體策略類,增加新的具體策略類也很方便。策略模式提供了一種可插入式(Pluggable)演算法的實現方案。
【作者:劉偉 http://blog.csdn.net/lovelion】
相關文章
- 演算法的封裝與切換——策略模式(三)演算法封裝模式
- 封裝頭部切換檢視封裝
- Weblogic產品模式切換與JVM切換Web模式JVM
- 歸檔模式與非歸檔模式的切換模式
- 模板方法模式--封裝演算法模式封裝演算法
- ToolBar封裝策略封裝
- javascript設計模式與開發實踐(二)- 封裝和原型模式JavaScript設計模式封裝原型
- redis sentinel哨兵模式安裝部署和切換Redis模式
- 策略模式、策略模式與Spring的碰撞模式Spring
- 360隨身wifi無線網路卡模式與wifi模式換切換方法WiFi模式
- iOS 封裝頁數控制,點選NavigationTabBar切換頁面iOS封裝NavigationtabBar
- win10怎麼切換到桌面模式_win10平板模式和桌面模式的切換教程Win10模式
- Oracle日誌模式切換Oracle模式
- 【DG】三大模式切換模式
- 商品顯示模式切換模式
- DataGuard切換保護模式模式
- 如何實現一個地相簿封裝,可以快速切換地圖封裝地圖
- 【資料結構與演算法】二叉搜尋樹的簡單封裝資料結構演算法封裝
- 模板方法模式-封裝一套演算法流程模式封裝演算法
- IMSDK封裝<二>封裝
- Win10怎樣切換平板模式_win10如何切換到平板模式Win10模式
- MVP模式的經典封裝MVP模式封裝
- 鎖定客戶的六大策略:教你如何將切換成本嵌入商業模式模式
- 微信支付iOS整合與二次封裝iOS封裝
- 單體模式封裝模式封裝
- DG_三大模式切換模式
- win10安全模式切換正常模式的方法Win10模式
- if else與策略模式模式
- 策略模式與模板方法模式模式
- EDBPPAS(Oracle相容版)Oracle與PostgreSQL相容模式的引數配置切換OracleSQL模式
- 設計模式第二講--策略模式設計模式
- 主備切換的準備工作(二)
- Emacs月月積累(二):視窗、緩衝區和常用模式切換Mac模式
- Oracle學習系列—歸檔模式的切換Oracle模式
- android volley解析與二次封裝Android封裝
- EDB PPAS(Oracle 相容版) Oracle與PostgreSQL 相容模式的引數配置切換OracleSQL模式
- KindEditor如何切換成簡單模式??模式
- 從簡單恢復模式切換模式