在現實生活中常常遇到實現某種目標存在多種策略可供選擇的情況,例如,出行旅遊可以乘坐飛機、乘坐火車、騎自行車或自己開私家車等,超市**可以釆用打折、送商品、送積分等方法。
在軟體開發中也常常遇到類似的情況,當實現某乙個功能存在多種演算法或者策略,我們可以根據環境或者條件的不同選擇不同的演算法或者策略來完成該功能,如資料排序策略有氣泡排序、選擇排序、插入排序、二叉樹排序等。
如果使用多重條件轉移語句實現(if else if),不但使條件語句變得很複雜,而且增加、刪除或更換演算法要修改原**,不易維護,違背開閉原則。如果採用策略模式就能很好解決該問題。
策略(strategy)模式的定義:該模式定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的變化不會影響使用演算法的客戶。策略模式屬於物件行為模式,它通過對演算法進行封裝,把使用演算法的責任和演算法的實現分割開來,並委派給不同的物件對這些演算法進行管理。
策略模式的主要優點如下。
多重條件語句不易維護,而使用策略模式可以避免使用多重條件語句。
策略模式提供了一系列的可供重用的演算法族,恰當使用繼承可以把演算法族的公共**轉移到父類裡面,從而避免重複的**。
策略模式可以提供相同行為的不同實現,客戶可以根據不同時間或空間要求選擇不同的。
策略模式提供了對開閉原則的完美支援,可以在不修改原**的情況下,靈活增加新演算法。
策略模式把演算法的使用放到環境類中,而演算法的實現移到具體策略類中,實現了二者的分離。
其主要缺點如下。
客戶端必須理解所有策略演算法的區別,以便適時選擇恰當的演算法類。
策略模式造成很多的策略類。
策略模式是準備一組演算法,並將這組演算法封裝到一系列的策略類裡面,作為乙個抽象策略類的子類。策略模式的重心不是如何實現演算法,而是如何組織這些演算法,從而讓程式結構更加靈活,具有更好的維護性和擴充套件性,現在我們來分析其基本結構和實現方法。
1. 模式的結構
策略模式的主要角色如下。
抽象策略(strategy)類:定義了乙個公共介面,各種不同的演算法以不同的方式實現這個介面,環境角色使用這個介面呼叫不同的演算法,一般使用介面或抽象類實現。
具體策略(concrete strategy)類:實現了抽象策略定義的介面,提供具體的演算法實現。
環境(context)類:持有乙個策略類的引用,最終給客戶端呼叫。
/// /// 具體策略類a
///
public class concretestrategya : strategy
}//具體策略類b
public class concretestrategyb : strategy
}/// /// 環境類
參考:
設計模式之策略模式
include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...
設計模式之 策略模式
策略模式 strategy pattern 定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各...
設計模式之策略模式
何為策略,就是可以實現目標的方案集合。而完成一項任務有不同的方式,每一種方式稱為乙個策略。策略模式就是定義一系列演算法,將每乙個演算法封裝起來,並讓他們可以相互替換。很簡單的乙個例子 年底移動公司推出很多的活動,比如說 存話費贈食用油,交話費贈話費,買手機贈話費 等等。推出這些個活動目的就只有乙個,...