2.策略模式
1策略模式的核心內(nèi)容是:
A:包含策略的抽象類
B:不同的策略分別實(shí)現(xiàn)
C:策略控制器,通過這個策略控制器實(shí)現(xiàn)調(diào)度控制策略。
2策略模式的作用是根據(jù)傳遞進(jìn)去的參數(shù)不同,實(shí)現(xiàn)調(diào)度執(zhí)行不同的策略。
3策略模式具體描述
策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨(dú)立的類中,
?
從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下
?
發(fā)生變化。策略模把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,
?
各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,
修改都不會影響到環(huán)境和客戶端。
?
跟不同類型的MM約會,要用不同的策略,有的請電影比較好,
有的則去吃小吃效果不錯,有的去海邊浪漫最合適,但目的都是為了得到MM的芳心,
我的追MM錦囊中有好多Strategy哦。
?
策略的抽象類,接口,抽象類的指針可以訪問所有子類對象,(純虛函數(shù))
實(shí)現(xiàn)的各種策略,各種策略的實(shí)現(xiàn)類,都必須繼承抽象類
策略的設(shè)置接口類,設(shè)置不同策略
4.策略模式類圖
5.代碼:
#include<iostream>
#include<cmath>
#include <string>
using namespace std;
//策略模式:策略模式針對一組算法,將每一個算法封裝到具有共同接口的獨(dú)立的類中,
?
//從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶端的情況下
?
//發(fā)生變化。策略模把行為和環(huán)境分開。環(huán)境類負(fù)責(zé)維持和查詢行為類,
?
//各種算法在具體的策略類中提供。由于算法和環(huán)境獨(dú)立開來,算法的增減,
//修改都不會影響到環(huán)境和客戶端。
//
//跟不同類型的MM約會,要用不同的策略,有的請電影比較好,
//有的則去吃小吃效果不錯,有的去海邊浪漫最合適,但目的都是為了得到MM的芳心,
//我的追MM錦囊中有好多Strategy哦。
?
//策略的抽象類,接口,抽象類的指針可以訪問所有子類對象,(純虛函數(shù))
//實(shí)現(xiàn)的各種策略,各種策略的實(shí)現(xiàn)類,都必須繼承抽象類
//策略的設(shè)置接口類,設(shè)置不同策略
?
//收錢的抽象類,也就是策略的抽象類
class CashSuper
{
public:
??? //收錢的純虛函數(shù)
??? virtual double acceptMoney(double money) = 0;
};
?
//正常收錢的策略
class CashNormal :public CashSuper
{
public:
??? //正常收錢
??? double acceptMoney(double money)
??? {
??????? return money;
??? }
};
?
//打折的策略
class CashRebate :public CashSuper
{
private:
??? double discount;
public:
??? //折扣
??? CashRebate(double dis)
??? {
??????? discount = dis;
??? }
??? //收錢
??? double acceptMoney(double money)
??? {
??????? //折扣
??????? return money*discount;
??? }
};
?
//返現(xiàn)的策略
class CashReturn :public CashSuper
{
private:
??? double moneyCondition;
??? double moneyReturn;
public:
??? //花多少錢,返回多少錢
??? CashReturn(double mc, double mr)
??? {
??????? moneyCondition = mc;
??????? moneyReturn = mr;
??? }
??? //收錢,返款
??? double acceptMoney(double money)
??? {
??????? double result = money;
??????? if (money >= moneyCondition)
??????? {
??????????? result = money - floor(money / moneyCondition)*moneyReturn;
??????? }
??????? return result;
??? }
};
?
//策略的控制類
class? CashContext
{
private:
??? CashSuper *cs;
public:
??? CashContext(string str)//設(shè)置策略
??? {
??????? if (str == "正常收費(fèi)")
??????? {
??????????? cs = new CashNormal();
??????? }
??????? else if (str == "打9折")
??????? {
??????????? cs = new CashRebate(0.9);
??????? }
??????? else if (str == "滿1000送200")
??????? {
??????????? cs = new CashReturn(1000, 200);
??????? }
??? }
??? double getResult(double money)
??? {
??????? return cs->acceptMoney(money);
??? }
};
?
int main()
{
??? double money = 1000;
??? //可以改變下面括號中的值,如果是下面的的一句,運(yùn)行結(jié)果是800
??? //CashContext *cc = new CashContext("滿1000送200");
??? //若是下面這句,顯示的是1000
??? //CashContext *cc = new CashContext("正常收費(fèi)");
??? //下面的這句的意思是打九折,運(yùn)行結(jié)果是:900
??? CashContext *cc = new CashContext("打9折");
???
??? cout << cc->getResult(money);
??? cin.get();
??? return 0;
}
?
總結(jié)