中介者模式

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值