亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之策略模式

2020-01-26 15:15:43
字體:
來源:轉載
供稿:網友

前言

剛剛加班回來;哎,公司規定平時加班只有10塊錢的餐補;星期六和星期天加班,只給串休假;在國家規定的節假日按照3倍工資發放。那么對于這么多的計算加班費的方法,公司的OA系統是如何進行做的呢?這就要說到今天我這里總結的策略設計模式了。

策略模式

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對策略模式是這樣說的:定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。該模式使得算法可獨立于使用它的客戶而變化。

策略模式為了適應不同的需求,只把變化點封裝了,這個變化點就是實現不同需求的算法,但是,用戶需要知道各種算法的具體情況。就像上面的加班工資,不同的加班情況,有不同的算法。我們不能在程序中將計算工資的算法進行硬編碼,而是能自由的變化的。這就是策略模式。

UML類圖

Strategy:定義所有支持的算法的公共接口。Context使用這個接口來調用某ConcreteStrategy定義的算法;
ConcreteStrategy:實現Strategy接口的具體算法;
Context:使用一個ConcreteStrategy對象來配置;維護一個對Stategy對象的引用,同時,可以定義一個接口來讓Stategy訪問它的數據。

使用場合

當存在以下情況時使用Strategy模式:

1.許多相關的類僅僅是行為有異。“策略”提供了一種用多個行為中的一個行為來配置一個類的方法;
2.需要使用一個算法的不同變體;
3.算法使用客戶不應該知道的數據。可使用策略模式以避免暴露復雜的、與算法相關的數據結構;
4.一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現。將相關的條件分支移入它們各自的Strategy類中以替代這些條件語句。(是不是和狀態模式有點一樣哦?)

代碼實現

首先實現最單純的策略模式,代碼如下:

復制代碼 代碼如下:

#include <iostream>
using namespace std;
 
// The abstract strategy
class Strategy
{
public:
     virtual void AlgorithmInterface() = 0;
};
 
class ConcreteStrategyA : public Strategy
{
public:
     void AlgorithmInterface()
     {
          cout<<"I am from ConcreteStrategyA."<<endl;
     }
};
 
class ConcreteStrategyB : public Strategy
{
public:
     void AlgorithmInterface()
     {
          cout<<"I am from ConcreteStrategyB."<<endl;
     }
};
 
class ConcreteStrategyC : public Strategy
{
public:
     void AlgorithmInterface()
     {
          cout<<"I am from ConcreteStrategyC."<<endl;
     }
};
 
class Context
{
public:
     Context(Strategy *pStrategyArg) : pStrategy(pStrategyArg)
     {
     }
     void ContextInterface()
     {
          pStrategy->AlgorithmInterface();
     }
private:
     Strategy *pStrategy;
};
 
int main()
{
     // Create the Strategy
     Strategy *pStrategyA = new ConcreteStrategyA;
     Strategy *pStrategyB = new ConcreteStrategyB;
     Strategy *pStrategyC = new ConcreteStrategyC;
     Context *pContextA = new Context(pStrategyA);
     Context *pContextB = new Context(pStrategyB);
     Context *pContextC = new Context(pStrategyC);
     pContextA->ContextInterface();
     pContextB->ContextInterface();
     pContextC->ContextInterface();
 
     if (pStrategyA) delete pStrategyA;
     if (pStrategyB) delete pStrategyB;
     if (pStrategyC) delete pStrategyC;
 
     if (pContextA) delete pContextA;
     if (pContextB) delete pContextB;
     if (pContextC) delete pContextC;
}

在實際操作的過程中,我們會發現,在main函數中,也就是在客戶端使用策略模式時,會創建非常多的Strategy,而這樣就莫名的增加了客戶端的壓力,讓客戶端的復雜度陡然增加了。那么,我們就可以借鑒簡單工廠模式,使策略模式和簡單工廠模式相結合,從而減輕客戶端的壓力,代碼實現如下:

復制代碼 代碼如下:

#include <iostream>
using namespace std;
 
// Define the strategy type
typedef enum StrategyType
{
    StrategyA,
    StrategyB,
    StrategyC
}STRATEGYTYPE;
 
// The abstract strategy
class Strategy
{
public:
    virtual void AlgorithmInterface() = 0;
    virtual ~Strategy() = 0; // 謝謝hellowei提出的bug,具體可以參見評論
};
 
Strategy::~Strategy()
{}
 
class ConcreteStrategyA : public Strategy
{
public:
    void AlgorithmInterface()
    {
        cout << "I am from ConcreteStrategyA." << endl;
    }
 
    ~ConcreteStrategyA(){}
};
 
class ConcreteStrategyB : public Strategy
{
public:
    void AlgorithmInterface()
    {
        cout << "I am from ConcreteStrategyB." << endl;
    }
 
    ~ConcreteStrategyB(){}
};
 
class ConcreteStrategyC : public Strategy
{
public:
    void AlgorithmInterface()
    {
        cout << "I am from ConcreteStrategyC." << endl;
    }
 
    ~ConcreteStrategyC(){}
};
 
class Context
{
public:
    Context(STRATEGYTYPE strategyType)
    {
        switch (strategyType)
        {
        case StrategyA:
            pStrategy = new ConcreteStrategyA;
            break;
 
        case StrategyB:
            pStrategy = new ConcreteStrategyB;
            break;
 
        case StrategyC:
            pStrategy = new ConcreteStrategyC;
            break;
 
        default:
            break;
        }
    }
 
    ~Context()
    {
        if (pStrategy) delete pStrategy;
    }
 
    void ContextInterface()
    {
        if (pStrategy)
            pStrategy->AlgorithmInterface();
    }
 
private:
    Strategy *pStrategy;
};
 
int main()
{
    Context *pContext = new Context(StrategyA);
    pContext->ContextInterface();
 
    if (pContext) delete pContext;
}

在上面這個代碼中,其實,我們可能看到的更多的是簡單工廠模式的應用,我們將策略模式將簡單工廠模式結合在了一起,讓客戶端使用起來更輕松。

總結

策略模式和狀態模式,是大同小異的;狀態模式講究的是狀態的變化,和不同狀態下,執行的不同行為;而策略模式側重于同一個動作,實現該行為的算法的不同,不同的策略封裝了不同的算法。策略模式適用于實現某一功能,而實現該功能的算法是經常改變的情況。在實際工作中,遇到了實際的場景,可能會有更深的體會。比如,我們做某一個系統,該系統可以適用于各種數據庫,我們都知道,連接某一種數據庫的方式是不一樣的,也可以說,連接數據庫的“算法”都是不一樣的。這樣,我們就可以使用策略模式來實現不同的連接數據庫的策略,從而實現數據庫的動態變換。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久五月天| 欧美香蕉大胸在线视频观看| 精品中文字幕久久久久久| 亚洲高清免费观看高清完整版| 精品香蕉一区二区三区| 亚洲аv电影天堂网| 色视频www在线播放国产成人| 国产精品久久91| 国产精品揄拍一区二区| 91精品国产91久久久久久吃药| 亚洲欧美999| 8090成年在线看片午夜| 亚洲色图欧美制服丝袜另类第一页| 久久久久一本一区二区青青蜜月| 国产欧美精品一区二区三区介绍| 欧美大全免费观看电视剧大泉洋| 国产一区二区三区在线观看视频| 国产97在线观看| 91影院在线免费观看视频| 亚洲欧洲一区二区三区久久| 亚洲人成在线观看网站高清| 国产精品视频男人的天堂| 欧美性xxxx在线播放| 国产丝袜视频一区| 一区国产精品视频| 97成人超碰免| 97久久精品人人澡人人爽缅北| 国产亚洲视频在线| 国内久久久精品| 亚洲石原莉奈一区二区在线观看| 精品久久久久久久久久ntr影视| 日韩av中文字幕在线免费观看| 日韩在线激情视频| 深夜成人在线观看| 国产视频精品va久久久久久| 久久国产精品影视| 国产精品青青在线观看爽香蕉| 视频在线观看一区二区| 青青久久av北条麻妃海外网| 欧美性20hd另类| 亚洲成人精品在线| 精品国产成人av| 欧美噜噜久久久xxx| 欧美精品一区在线播放| 亚洲偷熟乱区亚洲香蕉av| 伦理中文字幕亚洲| 精品成人av一区| 这里只有精品在线播放| 欧美激情中文网| 国产日韩换脸av一区在线观看| 欧美另类交人妖| 欧美日韩电影在线观看| 国产精品久久久久久久久借妻| 日韩暖暖在线视频| 亚洲午夜未满十八勿入免费观看全集| 97精品一区二区视频在线观看| 亚洲欧美日韩国产中文专区| 欧美成人黑人xx视频免费观看| 上原亚衣av一区二区三区| 欧美激情视频免费观看| 黄色成人av网| 爽爽爽爽爽爽爽成人免费观看| 欧美第一淫aaasss性| 国产精品男女猛烈高潮激情| 国内精品视频一区| 久久91精品国产91久久跳| 成人亚洲激情网| 热99精品只有里视频精品| 日本免费久久高清视频| 成人在线国产精品| 国产精品视频1区| 欧美国产高跟鞋裸体秀xxxhd| 色婷婷av一区二区三区在线观看| 亚洲第一区中文字幕| 国产精品美女在线| 亚洲国产另类久久精品| 91免费综合在线| 91国在线精品国内播放| 日韩在线中文视频| 亚洲精品自在久久| 亚洲日本成人女熟在线观看| 日韩av中文字幕在线| 美女福利视频一区| 人九九综合九九宗合| www.色综合| 亚洲高清色综合| 午夜精品蜜臀一区二区三区免费| 在线播放精品一区二区三区| 日韩视频免费在线观看| 91国内在线视频| 欧美国产视频日韩| 欧美性生活大片免费观看网址| 欧美成人免费在线视频| 丝袜美腿精品国产二区| 日韩av一区在线观看| 国产成+人+综合+亚洲欧洲| 久久精品免费电影| 日韩动漫免费观看电视剧高清| 欧美极品在线视频| 国产精品视频在线播放| 欧美一区二粉嫩精品国产一线天| 久久久免费av| 欧美在线欧美在线| 国产精品第8页| 久久久久久久久亚洲| 国产精品久久久久久婷婷天堂| 永久免费毛片在线播放不卡| 狠狠躁夜夜躁人人爽超碰91| 久久精品99久久久香蕉| 久久久黄色av| 欧美日韩不卡合集视频| 亚洲成人aaa| 日韩精品在线第一页| 日韩av123| 国产丝袜一区二区三区免费视频| 亚洲人精选亚洲人成在线| 欧美日韩国产精品一区二区三区四区| 久久久久国产精品免费网站| 中文字幕亚洲字幕| 在线播放精品一区二区三区| 国产自摸综合网| 国产精品大陆在线观看| 国产精品一区二区三区久久久| 在线观看精品自拍私拍| 久久久精品网站| 久久99久久久久久久噜噜| 国产日韩专区在线| 亚洲激情免费观看| 91精品国产综合久久香蕉最新版| 美日韩精品免费视频| 国产精品福利网站| 91系列在线观看| 成人激情视频小说免费下载| 日韩av在线播放资源| 91精品国产91久久久久久| 国产亚洲成精品久久| 欧美性极品xxxx做受| 中文字幕在线看视频国产欧美在线看完整| 国产精品久久久久av免费| 色无极亚洲影院| 国产高清在线不卡| 欧美在线观看网站| 日韩精品欧美国产精品忘忧草| 97视频在线观看免费高清完整版在线观看| 亚洲欧美一区二区三区情侣bbw| 中文字幕日韩电影| 欧美在线观看www| 亚洲国产精久久久久久| 91在线无精精品一区二区| 亚洲国语精品自产拍在线观看| 久久97精品久久久久久久不卡| 这里只有视频精品| 日韩av不卡电影| 国产一区二区三区在线播放免费观看| 日韩精品视频观看| 欧美成人第一页| 国产精品一区久久| 国产精品人成电影在线观看| 成人免费看吃奶视频网站| 国产日韩专区在线| 97高清免费视频| 欧美高清在线播放| 91九色精品视频| 亚洲视频在线观看网站|