C++ 設計模式-》中介者模式(Mediator)

文件“F_DesignMode_Mediator.h”

#ifndef F_DESIGN_MODE_MEDIATOR_20171020_KJASHD_H_
#define F_DESIGN_MODE_MEDIATOR_20171020_KJASHD_H_

#include <iostream> 
using namespace std;

/*
設計模式: Mediator  中介者模式
定義:用一箇中介者對象封裝一系列的對象交互,中介者使各對象不需要顯示地相互作用,從而降低耦合,而且可以獨立地改變它們之間的交互。

中介者模式, 實現的是集中化控制, 他把各個對象之間的交互工作全部轉移到了中介者身上, 於是中介者就變得相對比較複雜了。 
如果繪製拓撲結構, 一般是一個星形結構。 
集中化控制既是這個模式的優點,也是這個模式的缺點。

中介者模式, 一般應用於一組對象定義良好, 但是需要複雜的方式進行通信的場合。
*/

//! 性別
enum E_SEX
{
    SEX_WOMEN,
    SEX_MAN
};

//! 條件
enum E_GRADE
{
    GRADE_WORST,
    GRADE_BAD,
    GRADE_NORMAL,
    GRADE_GOOD,
    GRADE_PERFECT
};

//年齡
#define INT_AGE unsigned int

class Mediator;

class Person
{
public:
    Person(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator);
    ~Person();

    string GetName();
    E_SEX GetSex();
    INT_AGE GetAge();
    E_GRADE GetGrade();

private:
    Person(const Person &Other);

public:
    virtual void GetPartment(Person *pParter) = 0;

private:
    string  m_strName;  //姓名
    E_SEX   m_eSex;     //性別
    INT_AGE m_unAge;    //年齡
    E_GRADE m_eGrade;   //條件,等級

public:
    Mediator *m_pMediator;//媒婆
};

class PersonMan: public Person
{
public:
    PersonMan(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator);
public:
    void GetPartment(Person *pPartment);
};

class PersonWoman: public Person
{
public:
    PersonWoman(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator);
public:
    void GetPartment(Person *pPartment);
};

class Mediator
{
public:
    Mediator();

public:
    void SetMan(Person *pMan);
    void SetWoman(Person *pWomen);
    void GetParter(Person *pParter);

private:
    Person *m_pWoman;
    Person *m_pMan;
};

#endif//F_DESIGN_MODE_MEDIATOR_20171020_KJASHD_H_

文件“F_DesignMode_Mediator.cpp”

#include "stdafx.h"
#include "F_DesignMode_Mediator.h"

Person::Person(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator)
: m_strName(strName)
, m_eSex(eSex)
, m_unAge(unAge)
, m_eGrade(eGrade)
, m_pMediator(pMediator)
{}

Person::~Person()
{}

string Person::GetName()
{
    return m_strName;
}

E_SEX Person::GetSex()
{
    return m_eSex;
}

INT_AGE Person::GetAge()
{
    return m_unAge;
}

E_GRADE Person::GetGrade()
{
    return m_eGrade;
}

PersonMan::PersonMan(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator)
:Person(strName, eSex, unAge, eGrade, pMediator)
{}

void PersonMan::GetPartment(Person *pPartment)
{
    m_pMediator->SetMan(this);
    m_pMediator->SetWoman(pPartment);
    m_pMediator->GetParter(pPartment);
}

PersonWoman::PersonWoman(string strName, E_SEX eSex, INT_AGE unAge, E_GRADE eGrade, Mediator *pMediator)
:Person(strName, eSex, unAge, eGrade, pMediator)
{}

void PersonWoman::GetPartment(Person *pPartment)
{
    m_pMediator->SetMan(pPartment);
    m_pMediator->SetWoman(this);
    m_pMediator->GetParter(pPartment);
}

Mediator::Mediator()
{}

void Mediator::SetMan(Person *pMan)
{
    m_pMan = pMan;
}

void Mediator::SetWoman(Person *pWomen)
{
    m_pWoman = pWomen;
}

void Mediator::GetParter(Person *pParter)
{
    TRACE("\n\n%s & %s\n", m_pMan->GetName().data(), m_pWoman->GetName().data());

    if (m_pWoman->GetSex() == m_pMan->GetSex())
    {
        TRACE("在中國, 同性戀目前不合法, 小心被千刀萬剮\n");
        return;
    }

    int nAge = m_pMan->GetAge() - m_pWoman->GetAge();
    nAge = nAge < 0 ? -nAge : nAge;
    TRACE("兩位年齡相差: %d歲", nAge);

    int nGrade = m_pMan->GetGrade() - m_pWoman->GetGrade();
    nGrade = nGrade < 0 ? -nGrade : nGrade;
    if(nGrade == 0)
    {
        TRACE("\n兩位門當戶對,可以結婚\n\n");
    }
    else if(nGrade <= 2)
    {
        TRACE("\n兩位勉強能在一起過日子\n\n");
    }
    else
    {
        TRACE("\n你倆條件相差太大,還是算了吧\n");
    }
}

文件“F_DesignMode_Mediator_Test.h”

#ifndef F_DESIGN_MODE_MEDIATOR_TEST_20171020_KJASHD_H_
#define F_DESIGN_MODE_MEDIATOR_TEST_20171020_KJASHD_H_

#include "F_DesignMode_Mediator.h"

template<class T>
inline void SafeDelete(T **pData)
{
    if(*pData)
    {
        delete(*pData);
        *pData = NULL;
    }
}

#define SAFE_DELETE(p)\
{\
    if (p)\
    {\
        delete(p);\
        p = NULL;\
    }\
}

void F_DesignMode_Mediator_Test()
{
    TRACE("\n\n 中介者模式 \n");

    Mediator *pMediator = new Mediator;
    Person *pXiaoFang= new PersonWoman("小芳", SEX_WOMEN, 25, GRADE_PERFECT, pMediator);
    Person *pZhangSan = new PersonMan("張三", SEX_MAN, 22, GRADE_GOOD, pMediator);
    Person *pLiSi = new PersonMan("李四", SEX_MAN, 27, GRADE_WORST, pMediator);
    Person *pWangWu = new PersonMan("王五", SEX_MAN, 29, GRADE_PERFECT, pMediator);

    pXiaoFang->GetPartment(pWangWu);
    pXiaoFang->GetPartment(pLiSi);
    pXiaoFang->GetPartment(pZhangSan);
    pLiSi->GetPartment(pZhangSan);

    SAFE_DELETE(pXiaoFang);
    SAFE_DELETE(pZhangSan);
    SafeDelete(&pLiSi);
    SafeDelete(&pWangWu);
    SafeDelete(&pMediator);
}

#endif//F_DESIGN_MODE_MEDIATOR_TEST_20171020_KJASHD_H_

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章