文件“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_