天天看點

設計模式C++學習筆記之十(Strategy政策模式)

無意中,從網上下到一本電子書《24種設計模式介紹與6大設計原則》,很好奇這裡有24種設計模式,印象中GOF寫的《設計模式》(Design Patterns),好像隻有23種吧。運作起來一看,還真挺吸引咱的,裡面提到的例子都很有趣。很感謝作者寫出這樣好的例子來,我的目的是把作者提到的例子用C++來實作。寫這本書的作者是:cbf4life,更詳細的内容及說明可以參考原作者部落格:cbf4life.cnblogs.com。

這裡隻進行簡單提示和實作編碼。

解釋

main(),趙雲

CContext,錦囊

IStrategy,政策接口

CBackDoor,政策之一

CGivenGreenLight,政策之二

CBlockEnemy,政策之三

說明:一個政策放到一個錦囊裡。當用的時候,找到這個錦囊,從錦囊裡拿出政策來使用。

注意:錦囊隻是簡單的裝載和調用政策,錦囊裡沒有邏輯。政策會有更大的自主權,運作更多的邏輯。

看代碼:

//Context.h

#pragma once

#include "IStrategy.h"

class CContext

{

public:

    CContext(IStrategy *pStrategy);

    ~CContext(void);

    void Operate(void);

private:

    IStrategy *m_pStrategy;

};

//Context.cpp

#include "StdAfx.h"

#include "Context.h"

CContext::CContext(IStrategy *pStrategy)

{

    this->m_pStrategy = pStrategy;

}

CContext::~CContext(void)

{

    delete this->m_pStrategy;

}

void CContext::Operate(void)

{

    this->m_pStrategy->Operate();

}

//IStrategy.h

#pragma once

class IStrategy

{

public:

    IStrategy(void);

    virtual ~IStrategy(void);

    virtual void Operate(void) = 0;

};

//BackDoor.h

#pragma once

#include "istrategy.h"

class CBackDoor :

    public IStrategy

{

public:

    CBackDoor(void);

    ~CBackDoor(void);

    void Operate(void);

};

//BackDoor.cpp

#include "StdAfx.h"

#include "BackDoor.h"

#include <iostream>

using std::cout;

using std::endl;

CBackDoor::CBackDoor(void)

{

}

CBackDoor::~CBackDoor(void)

{

}

void CBackDoor::Operate(void)

{

    cout << "找喬國老幫忙,讓吳國太給孫權施加壓力" << endl;

}

//GivenGreenLight.h

#pragma once

#include "istrategy.h"

class CGivenGreenLight :

    public IStrategy

{

public:

    CGivenGreenLight(void);

    ~CGivenGreenLight(void);

    void Operate(void);

};

//GivenGreenList.cpp

#include "StdAfx.h"

#include "GivenGreenLight.h"

#include <iostream>

using std::cout;

using std::endl;

CGivenGreenLight::CGivenGreenLight(void)

{

}

CGivenGreenLight::~CGivenGreenLight(void)

{

}

void CGivenGreenLight::Operate(void)

{

    cout << "求吳國太開個綠燈,放行!" << endl;

}

//BlockEnemy.h

#pragma once

#include "istrategy.h"

class CBlockEnemy :

    public IStrategy

{

public:

    CBlockEnemy(void);

    ~CBlockEnemy(void);

    void Operate(void);

};

//BlockEnemy.cpp

#include "StdAfx.h"

#include "BlockEnemy.h"

#include <iostream>

using std::cout;

using std::endl;

CBlockEnemy::CBlockEnemy(void)

{

}

CBlockEnemy::~CBlockEnemy(void)

{

}

void CBlockEnemy::Operate()

{

    cout << "孫夫人斷後,擋住追兵" << endl;

}

//Strategy.cpp

#include "stdafx.h"

#include "Context.h"

#include "BackDoor.h"

#include "GivenGreenLight.h"

#include "BlockEnemy.h"

#include <iostream>

using std::cout;

using std::endl;

int _tmain(int argc, _TCHAR* argv[])

{

    CContext *pContext;

    cout << "\14\n\n\n\n\17" << endl;

    cout << "----------剛剛到吳國的時候拆第一個----------" << endl;

    pContext = new CContext(new CBackDoor());

    pContext->Operate();

    delete pContext;

    cout << "\14\n\n\n\n\17" << endl;

    cout << "----------劉備樂不思蜀了,拆第二個了----------" << endl;

    pContext = new CContext(new CGivenGreenLight());

    pContext->Operate();

    delete pContext;

    cout << "\14\n\n\n\n\17" << endl;

    cout << "----------孫權的小兵追了,咋辦?拆第三個----------" << endl;

    pContext = new CContext(new CBlockEnemy());

    pContext->Operate();

    delete pContext;

    _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);

    _CrtDumpMemoryLeaks();

    return 0;

}

設計模式C++學習筆記之十(Strategy政策模式)

一個錦囊隻能裝一個妙計,趙雲可以有多個錦囊。屬于對象行為型模式。很簡單的一個模式了,貌似這24個裡面,這是最簡單的了。也好,先用一個簡單容易的開頭,都說萬事開頭難,找個簡單的開始,鼓勵自己堅持學下來,就會有收獲。部落格也會起到這個作用吧,鼓勵自己。上圖不是單純的抽象出來的模式類圖,而隻是描述了代碼裡用到的類之間的關系圖。真正的抽象類圖,隻有政策接口和一個政策實作類,還有CContext類以及Client。