Mediator 模式中,类之间的交互行为被统一放在 Mediator 的对象中,对象通过 Mediator 对象同其他对象交互,Mediator 对象起着控制器的作用。
Mediator 抽象中介者
中介者类的抽象父类。
concreteMediator
具体的中介者类。
Colleague
关联类的抽象父类。
concreteColleague
具体的关联类。
中介者模式适用于:用一个中介对象,封装一些列对象(同事)的交换,中介者使各个对象不需要显
示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换。
中介者模式优点
1,将系统按功能分割成更小的对象,符合类的最小设计原则
2,对关联对象的集中控制
3,减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而 Mediator 模式将原来相互依存的多对多的类之间的关系简化为 Mediator 控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在 Mediator 控制类)。
4,有利于提高类的重用性。
class Person
{
public:
Person(string name, int gender, int level)
{
m_name = name;
m_gender = gender;
m_level = level;
}
string getName()
{
return m_name;
}
int getGender()
{
return m_gender;
}
int getLevel()
{
return m_level;
}
virtual void getParter(Person* p) = 0;
protected:
string m_name;//
int m_gender; //1 男 2 女
int m_level; //123456789;
};
class Man : public Person
{
public:
Man(string name, int gender, int level) :Person(name, gender, level)
{
;
}
virtual void getParter(Person* p)
{
if (this->getGender() == p->getGender())
{
cout << "我不是同性恋" << endl;
}
if (this->getLevel() == p->getLevel())
{
cout << this->getName() << " 和 " << p->getName() << "绝配" << endl;
}
else
{
cout << this->getName() << " 和 " << p->getName() << "不配" << endl;
}
}
protected:
};
class Woman : public Person
{
public:
Woman(string name, int sex, int condit) :Person(name, sex, condit)
{
;
}
virtual void getParter(Person* p)
{
if (this->getGender() == p->getGender())
{
cout << "No No No 我不是同性恋" << endl;
}
if (this->getLevel() == p->getLevel())
{
cout << this->getName() << " 和 " << p->getName() << "绝配" << endl;
}
else
{
cout << this->getName() << " 和 " << p->getName() << "不配" << endl;
}
}
protected:
};
void testMethod() {
Woman* w1 = new Woman("小芳", 2, 4);
Man* m1 = new Man("张三", 1, 3);
Man* m2 = new Man("李四", 1, 4);
w1->getParter(m1);
w1->getParter(m2);
delete w1;
delete m1;
delete m2;
return;
}
class Mediator;
class PersonObj
{
public:
PersonObj(string name, int gender, int level, Mediator* m)
{
m_name = name;
m_gender = gender;
m_level = level;
m_m = m;
}
string getName()
{
return m_name;
}
int getGender()
{
return m_gender;
}
int getLevel()
{
return m_level;
}
Mediator* getMediator()
{
return m_m;
}
public:
virtual void getParter(PersonObj* p) = 0;
protected:
string m_name;//
int m_gender; //1 男 2 女
int m_level; //123456789;
Mediator* m_m;
};
class Mediator
{
public:
Mediator()
{
pMan = NULL;
pWoman = NULL;
}
void setWoman(PersonObj* p)
{
pWoman = p;
}
void setMan(PersonObj* p)
{
pMan = p;
}
void getPartner()
{
if (pMan->getGender() == pWoman->getGender())
{
cout << "No No No 我不是同性恋" << endl;
}
if (pMan->getLevel() == pWoman->getLevel())
{
cout << pMan->getName() << " 和 " << pWoman->getName() << "绝配" << endl;
}
else
{
cout << pMan->getName() << " 和 " << pWoman->getName() << "不配" << endl;
}
}
protected:
private:
PersonObj* pMan;
PersonObj* pWoman;
};
class Woman2 : public PersonObj
{
public:
Woman2(string name, int gender, int level, Mediator* m) : PersonObj(name, gender, level, m)
{
;
}
virtual void getParter(PersonObj* p)
{
this->getMediator()->setWoman(this);
this->getMediator()->setMan(p);
this->getMediator()->getPartner();
}
private:
};
class Man2 : public PersonObj
{
public:
Man2(string name, int gender, int level, Mediator* m) : PersonObj(name, gender, level, m)
{
;
}
virtual void getParter(PersonObj* p)
{
this->getMediator()->setMan(this);
this->getMediator()->setWoman(p);
this->getMediator()->getPartner();
}
private:
};
//通过中介者实现解耦合
void testMediator() {
Mediator* mediator = new Mediator;
Woman2* w1 = new Woman2("小芳", 2, 4, mediator);
Man2* m1 = new Man2("张三", 1, 3, mediator);
Man2* m2 = new Man2("李四", 1, 4, mediator);
mediator->setMan(m1);
mediator->setWoman(w1);
mediator->getPartner();
mediator->setMan(m2);
mediator->getPartner();
}
int main() {
//testMethod();
testMediator();
system("pause");
return 0;
}