中介者模式
2020 年 09 月 09 日 214 567 字 暂无评论

01.概念

  • Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。

02.角色和职责

  • GOOD:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而降低耦合;而且可以独立地改变它们之间的交互。

  • Mediator抽象中介者

    • 中介者类的抽象父类。
  • ConcreteMediator

    • 具体的中介者类。
  • Colleague

    • 关联类的抽象父类。
  • ConcreteColleague

    • 具体的关联类。
  • 适用于:

    • 用一个中介对象,封装一些列对象(同事)的交换,中介者是各个对象不需要显示的相互作用,从而实现了耦合松散,而且可以独立的改变他们之间的交换。

03.模式优点

  1. 将系统按功能分割成更小的对象,符合类的最小设计原则。
  2. 对关联对象的集中控制。
  3. 减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。
  4. 有利于提高类的重用性。

04.代码案例

#include <iostream>
#include <string>

using namespace std;

class Person
{
public:
        Person(string name, bool sex, int condit)
        {
                m_name = name;
                m_sex = sex;
                m_condition = condit;
        }
        string getName()
        {
                return m_name;
        }
        bool getSex()
        {
                return m_sex;
        }
        int getCondit()
        {
                return m_condition;
        }
        virtual void getParter(Person* p) = 0;
protected:
        string m_name;
        bool m_sex; //true男 false女
        int m_condition;
};

class Man : public Person
{
public:
        Man(string name, bool sex, int condit) :Person(name, sex, condit)
        {
        
        }
        virtual void getParter(Person* p)
        {
                if (this->getSex() == p->getSex())
                {
                        cout << "NO NO NO 我不是同性恋" << endl;
                }
                if (this->getCondit() == p->getCondit())
                {
                        cout << this->getName() << " 和 " << p->getName() << "匹配成功" << endl;
                }
                else
                {
                        cout << this->getName() << " 和 " << p->getName() << "匹配失败" << endl;
                }
        }
private:
};

class Woman : public Person
{
public:
        Woman(string name, bool sex, int condit) :Person(name, sex, condit)
        {

        }
        virtual void getParter(Person* p)
        {
                if (this->getSex() == p->getSex())
                {
                        cout << "NO NO NO 我不是同性恋" << endl;
                }
                if (this->getCondit() == p->getCondit())
                {
                        cout << this->getName() << " 和 " << p->getName() << "匹配成功" << endl;
                }
                else
                {
                        cout << this->getName() << " 和 " << p->getName() << "匹配失败" << endl;
                }
        }
private:
};

class Mediator;//先申明中介者类
class Person2
{
public:
        Person2(string name, bool sex, int condition, Mediator* m)
        {
                m_name = name;
                m_sex = sex;
                m_condition = condition;
                m_m = m;
        }
        string getName()
        {
                return m_name;
        }
        bool getSex()
        {
                return m_sex;
        }
        int getCondit()
        {
                return m_condition;
        }
        Mediator* getMediator()
        {
                return m_m;
        }
        virtual void getParter(Person2* p) = 0;
protected:
        string m_name;
        bool m_sex;
        int m_condition;
        Mediator* m_m;
};

class Mediator
{
public:
        Mediator()
        {
                pMan = NULL;
                pWoman = NULL;
        }
        void setWoman(Person2* p) 
        {
                pWoman = p;
        }
        void setMan(Person2* p)
        {
                pMan = p;
        }
        void getPartner()
        {
                if (pMan->getSex() == pWoman->getSex())
                {
                        cout << "No No No 我不是同性恋" << endl;
                }
                if (pMan->getCondit() == pWoman->getCondit())
                {
                        cout << pMan->getName() << " 和 " << pWoman->getName() << "配对成功" << endl;
                }
                else
                {
                        cout << pMan->getName() << " 和 " << pWoman->getName() << "配对失败" << endl;
                }
        }
private:
        Person2* pMan;
        Person2* pWoman;
};

class Man2 : public Person2
{
public:
        Man2(string name, bool sex, int condition, Mediator* m) : Person2(name, sex, condition, m)
        {
        
        }
        virtual void getParter(Person2* p)
        {
                this->getMediator()->setMan(this);
                this->getMediator()->setWoman(p);
                this->getMediator()->getPartner();
        }
};

class Woman2 : public Person2
{
public:
        Woman2(string name, bool sex, int condition, Mediator* m) : Person2(name, sex, condition, m)
        {

        }
        virtual void getParter(Person2* p)
        {
                this->getMediator()->setMan(this);
                this->getMediator()->setWoman(p);
                this->getMediator()->getPartner();
        }
};
void main()
{
        //未解耦合方式
        cout << "未解耦合方式" << endl;
        Woman* w1 = new Woman("小芳", false, 4);
        Man* m1 = new Man("张三", true, 3);
        Man* m2 = new Man("李四", true, 4);
        w1->getParter(m1);
        w1->getParter(m2);
        delete w1;
        delete m1;
        delete m2;
        cout << "---------------------" << endl;
        //中介者模式
        cout << "中介者模式" << endl;
        Mediator* mediator = new Mediator;
        Woman2* ww1 = new Woman2("小红", false, 1,mediator);
        Man2* mm1 = new Man2("小明", true, 1, mediator);
        Man2* mm2 = new Man2("小华", true, 2, mediator);
        ww1->getParter(mm1);
        ww1->getParter(mm2);
        delete ww1;
        delete mm1;
        delete mm2;
}
  • 输出
未解耦合方式
小芳 和 张三匹配失败
小芳 和 李四匹配成功
---------------------
中介者模式
小红 和 小明配对成功
小红 和 小华配对失败

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/146/



评论已关闭