zoukankan      html  css  js  c++  java
  • 大话设计模式--中介者模式 Mediator --C++实现实例

    1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互。

    Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.

    由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者变为比任何一个ConcreteColleague都复杂。

    中介者模式一般应用于一组对象以定义良好但复杂的方式进行通信的场合,以及想定制一个分部在多个类中的行为,而又不想生成太多的子类的场合。

    实例:

    colleague.h colleague.cpp

    #ifndef COLLEAGUE_H
    #define COLLEAGUE_H
    
    class Mediator;
    
    class Colleague
    {
    public:
        Colleague(Mediator *mediator);
    
    protected:
        Mediator *mediator;
    };
    
    #endif // COLLEAGUE_H
    #include "colleague.h"
    #include "mediator.h"
    
    Colleague::Colleague(Mediator *mediator)
    {
        this->mediator = mediator;
    }


    concretecolleague1.h concretecolleague1.cpp

    #ifndef CONCRETECOLLEAGUE1_H
    #define CONCRETECOLLEAGUE1_H
    
    #include "colleague.h"
    #include "mediator.h"
    #include <string>
    using namespace std;
    
    class ConcreteColleague1 : public Colleague
    {
    public:
        ConcreteColleague1(Mediator *mediator);
        void send(string message);
        void notify(string message);
    };
    
    #endif // CONCRETECOLLEAGUE1_H
    #include "concretecolleague1.h"
    #include <iostream>
    using namespace std;
    
    ConcreteColleague1::ConcreteColleague1(Mediator *mediator) : Colleague(mediator)
    {    
    }
    
    void ConcreteColleague1::send(string message)
    {
        mediator->send(message, this);
    }
    
    void ConcreteColleague1::notify(string message)
    {
        cout << "Colleague1 get a message: " << message << endl;
    }


    concretecolleague2.h concretecolleague2.cpp

    #ifndef CONCRETECOLLEAGUE2_H
    #define CONCRETECOLLEAGUE2_H
    
    #include "colleague.h"
    #include "mediator.h"
    #include <string>
    using namespace std;
    
    class ConcreteColleague2 : public Colleague
    {
    public:
        ConcreteColleague2(Mediator *mediator);
        void send(string message);
        void notify(string message);
    };
    
    #endif // CONCRETECOLLEAGUE2_H
    #include "concretecolleague2.h"
    #include <iostream>
    using namespace std;
    
    ConcreteColleague2::ConcreteColleague2(Mediator *mediator) : Colleague(mediator)
    {
    }
    
    void ConcreteColleague2::send(string message)
    {
        mediator->send(message, this);
    }
    
    void ConcreteColleague2::notify(string message)
    {
        cout << "Colleague2 get a message: " << message << endl;
    }

    mediator.h mediator.cpp

    #ifndef MEDIATOR_H
    #define MEDIATOR_H
    
    #include "colleague.h"
    #include <string>
    using namespace std;
    
    class Mediator
    {
    public:
        Mediator();
        void virtual send(string message, Colleague *colleague)=0;
    };
    
    #endif // MEDIATOR_H
    #include "mediator.h"
    
    Mediator::Mediator()
    {
    }


    concretemediator.h concretemediator.cpp

    #ifndef CONCRETEMEDIATOR_H
    #define CONCRETEMEDIATOR_H
    
    #include "mediator.h"
    #include "concretecolleague1.h"
    #include "concretecolleague2.h"
    
    class ConcreteMediator : public Mediator
    {
    public:
        ConcreteMediator();
        void setcolleague1(ConcreteColleague1 *colleague);
        void setcolleague2(ConcreteColleague2 *colleague);
        void send(string message, Colleague *colleague);
    
    private:
        ConcreteColleague1 *colleague1;
        ConcreteColleague2 *colleague2;
    };
    
    #endif // CONCRETEMEDIATOR_H
    #include "concretemediator.h"
    
    ConcreteMediator::ConcreteMediator()
    {
    }
    
    void ConcreteMediator::send(string message, Colleague *colleague)
    {
        if( colleague == colleague1  )
            colleague2->notify(message);
        else
            colleague1->notify(message);
    
    }
    
    void ConcreteMediator::setcolleague1(ConcreteColleague1 *colleague)
    {
        this->colleague1 = colleague;
    }
    
    void ConcreteMediator::setcolleague2(ConcreteColleague2 *colleague)
    {
        this->colleague2 = colleague;
    }


    main.cpp

    #include <iostream>
    #include "concretecolleague1.h"
    #include "concretecolleague2.h"
    #include "concretemediator.h"
    using namespace std;
    
    int main()
    {
        cout << "Mediator test!" << endl;
    
        ConcreteMediator *m = new ConcreteMediator();
        ConcreteColleague1 *c1 = new ConcreteColleague1(m);
        ConcreteColleague2 *c2 = new ConcreteColleague2(m);
        m->setcolleague1(c1);
        m->setcolleague2(c2);
        c1->send("I come from C1, how are you? ");
        c2->send("I come from C2, I am fine. ");
    
        return 0;
    }







     

  • 相关阅读:
    js之判断非空
    解决eclipse添加不了tomcat8的问题
    Java(eclipse)连接MySQL8.0以上版本数据库方式
    面试必备的:Redis和MongoDB的区别
    简述关系型数据库和非关系型数据库
    非关系型数据库MongoDB初探,以及和Redis的对比
    day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
    day52:django:ORM单表/多表操作
    day51:django:dispatch&模板渲染&过滤器&标签&组件&静态文件配置
    day50:django:有名/无名分组&FBV/CBV
  • 原文地址:https://www.cnblogs.com/xj626852095/p/3648092.html
Copyright © 2011-2022 走看看