引用於:大話設計模式 —— 第二章《策略模式》c++ **實現
策略模式介紹
簡單工廠模式只是解決物件的建立問題,而且由於工廠本身包括了所有的收費方式,商場可能經常性的更改打折額度和返利額度,每次維護或者擴充套件收費方式都要改動這個工廠,以致**需要重新編譯部署,這不是一種好方法。而且為了建立不同的物件產品使用了switch case(或if else)的形式實現**,這樣違背了開閉原則,即對擴充套件開放、對修改封閉,維護的成本會隨著cese(或else)的增加而增加,而本文的策略模式能較好地解決這個問題。
策略模式是處理演算法不同變體的一種行為型模式。,策略模式通過介面或抽象類提供公共的函式介面,即在抽象類中定義乙個抽象方法,實現該介面的派生類將實現該抽象類中的抽象方法。策略模式把針對不同派生類一系列的具體演算法分別封裝在不同的派生類中,使得各個派生類給出的具體演算法可以相互替換。
在策略模式中,抽象類提供公共的函式介面稱作策略,實現該介面的派生類稱作具體策略。
strategy是使用介面還是抽象類,這個取決於一系列的策略中是否有共同屬性或方法;如果沒有,使用介面更加靈活方便,反之使用抽象類,抽象類中便可存放公共的屬性以及方法。
下面是通常的策略模式的實現:
#includeusing namespace std;
class cashsuper //現金收費抽象類
cashsuper(){}
};class cashnormal :public cashsuper //子類:正常(原價)付費型別
; double acceptcash(double money) override };
class cashrebate :public cashsuper //打折收費子類
double acceptcash(double money) override
void setmoneyrebate() };
class cashreturn : public cashsuper //返利收費子類
void setmonereturn ()
//建構函式初始化返利條件和返利值,用的是初始值列表的形式進行初始化
explicit cashreturn(double condition, double returnnum) :m_moneycondition(condition), m_monereturn(returnnum)
double acceptcash(double money) override
return result;//返回計算返利後的價錢
}};//#include "cashsuper.h"
class cashcontext
double getresult(double money) };
int main()
優點大話設計模式上總結的優點:缺點使用場合當存在以下情況時使用strategy(策略)模式:
下面的**是 策略模式和簡單工廠模式的結合c++**:
#includeusing namespace std;
class cashsuper //現金收費抽象類
};class cashnormal :public cashsuper //子類:正常(原價)付費型別
double acceptcash(double money) override };
class cashrebate :public cashsuper //打折收費子類
double acceptcash(double money) override
void setmoneyrebate() };
class cashreturn : public cashsuper //返利收費子類
void setmoneyreturn()
//建構函式初始化返利條件和返利值,用的是初始值列表的形式進行初始化
explicit cashreturn(double condition, double returnnum) :m_moneycondition(condition), m_monereturn(returnnum)
double acceptcash(double money) override
return result;//返回計算返利後的價錢
}};//#include "cashsuper.h"
class cashcontext
} double getresult(double money) };
int main()
cout << "\n******************** 請輸入你想要使用的軟體功能的序號 ***************" << endl;
cout << "請輸入你的選擇:";
int userchoice(0);
if (cin >> userchoice && userchoice == 0 )
cashcontext *usermoney = nullptr;
switch (userchoice)
case 2:
else
}usermoney = new cashcontext(3, discount);
total = prices * productnumber;
totalprices = (usermoney->getresult(total));
cout << "打折完後收費為:" << totalprices << "元! " << endl;
break;
}case 3:
cout << "返利後收費為:" << totalprices << "元! " << endl;
break;
}case 4:
system("cls");
cout << "螢幕已經清屏,可以重新輸入!" << "\n" << endl;
break;
default:
cout << "輸入的序號不正確,請重新輸入!" << "\n" << endl;
} delete usermoney;
usermoney = nullptr;
} system("pause");
return 0;
}
結果:
大話設計模式 策略模式
前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...
大話設計模式 策略模式
前言 做事情的時候我們需要動動腦來簡化自己完成任務的負擔,這就需要講究策略了,我們會根據自己所處的環境列出所有的可能條件,再從中挑選合適的方法來完成這件事。就像我們過年回家,我們可以選擇高鐵 普通火車 還可以選擇硬座 軟座 臥鋪,這都是我們回家的策略 買不到直達的還得轉戰好幾個火車站,策略的最終到達...
大話設計模式 策略模式
上篇文章 大話設計模式 簡單工廠模式告訴了我們乙個網咖收費工廠物件怎樣建立收費形式 白天收費 夜間收費 的例項。簡單工廠 中有非常多 case分支語句 假設我們還想填加收費的形式 比方會員收費啊,通宵收費啊 就須要修改工廠 每次維護和擴充套件都要花費非常多時間,另外修改非常easy造成紕漏 比方之前...