策略模式(strategy pattern):定義了演算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化,不會影響到使用演算法的客戶。策略模式是一種定義了一系列演算法的方法,從概念上來看,所以得這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。
我們先觀察策略模式(strategy pattern)的uml類圖:
根據前面的類圖我們可以知道策略模式由下面的幾個部分組成:
策略模式的優點:
策略模式的缺點:
根據商場打折、**等,演算法需要經常性的變動的場景來提供乙個策略模式實現的乙個收費程式。
首先定義乙個結算的抽象類(介面):
1然後根據打折、**等不同的活動實現具體收費功能的子類///2
///現金收費抽象類
3///
4abstract
class
cashsuper
5
1最後建立的是提供給客戶端呼叫的context類///2
///正常收費子類
3///
4class
cashnormal:cashsuper510
}1112///
13///
打折子類
14///
15class
cashrebate:cashsuper
1622
23public
override
double acceptcash(double
money)
2427}28
29///
30///
返利子類
31///
32class
cashreturn:cashsuper
3347
48public
override
double acceptcash(double
money)
4957 }
1在基本的策略模式中,選擇所用具體實現的職責由客戶端物件承擔,並轉給策略模式的context物件。這本身並沒有解除客戶端需要判斷選擇的壓力,而策略模式與簡單工廠結合後,選擇具體實現的職責也可以由context承擔,這就最大化減輕了客戶端的職責。class
cashcontext220
}2122//
和簡單工廠的不同之處
23public
double getresult(double
money)
2427 }
客戶**呼叫,編譯執行:
1 cashcontext csuper = newcashcontext(cmbdiscount.selecteditem.tostring());
2double totalprices =0d;
3 totalprices = csuper.getresult(double.parse(this.txtprice.text) * double.parse(this
.txtnumber.text));45
this.lbxresult.items.add("
單價:" + this.txtprice.text + "
數量:" + this.txtnumber.text + "
" + cmbdiscount.selecteditem + "
" + "
合計" +totalprices.tostring());
通過對比簡單工廠和策略模式的uml類圖我們可以發現二者結構比較相似:
我們可以發現使用策略模式實現的都可以使用簡單工廠來實現,二者都是通過使用繼承以多型的形式來實現的。在產品構造多次重疊,並且在不同時刻應用不同的規則(演算法)時使用策略模式比較合適。我們可以發現簡單工廠只是通過乙個靜態的類方法來建立不同的子類,但是在策略模式中除了通過多型建立不同的算法子類,還有乙個呼叫子類示例函式的乙個成員方法(context類中),所以在客戶端中我們只需要獲取乙個context例項時候,然後通過直接呼叫它的例項方法來間接呼叫子類的成員方法就可以了(建構函式使用簡單工廠來實現);但是在簡單工廠中我們除了通過呼叫工廠類的靜態方法獲取產品子類的例項,還要直接呼叫子類的成員方法。
設計模式之策略模式
include using namespace std 飛行行為介面類 class flystrategy 高空飛行行為具現類 class heightfly public flystrategy virtual void fly private heightfly 低空飛行行為具現類 class ...
設計模式之策略模式
何為策略,就是可以實現目標的方案集合。而完成一項任務有不同的方式,每一種方式稱為乙個策略。策略模式就是定義一系列演算法,將每乙個演算法封裝起來,並讓他們可以相互替換。很簡單的乙個例子 年底移動公司推出很多的活動,比如說 存話費贈食用油,交話費贈話費,買手機贈話費 等等。推出這些個活動目的就只有乙個,...
設計模式之策略模式
策略模式定義了一系列的演算法,並將每乙個演算法封裝起來,而且使它們還可以相互替換。從概念上來看,所有這些演算法完成的都是相同的工作,只是實現不同,它可以以相同的方式呼叫所有的演算法,減少了各種演算法類與使用演算法類之間的耦合。示例類圖 示例 public inte ce strategy publi...