设计模式一日一练:中介者模式(Mediator)

Posted _夜风_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式一日一练:中介者模式(Mediator)相关的知识,希望对你有一定的参考价值。

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

比较典型的例子是联合国、QQ群等。比如,如果中国有事需要通知世界各国,可以通过联合国这一个机构,QQ群可以接收并发布每个成员的消息。


/*
* file: Mediator.h
* brief: Created by night at 2016.12.07
*/

#ifndef __MEDIATOR_H__
#define __MEDIATOR_H__

#include <list>
#include <iostream>

using namespace std;


class Nation;
class Mediator 
public:
    virtual void Send(Nation* member, const char* msg) = 0;
;

class UnitedNationsMediator : public Mediator 
public:
    UnitedNationsMediator()  

    void Register(Nation* member)  members.push_back(member); 

    void Send(Nation* member, const char* msg);

    list<Nation*> members;
;


class Nation 
public:
    Nation(const char* sname, Mediator* m) : name(sname), mediator(m)  
    void Send(const char* msg)  mediator->Send(this, msg); 
    void Notify(const char* sender, const char* msg)  cout << name << "\\t<-- " << sender << ":\\t" << msg << endl; 

    const char* name;

protected:
    Mediator* mediator;
;


class China : public Nation

public:
    China(const char* sname, Mediator* m): Nation(sname, m)  
;

class USA : public Nation

public:
    USA(const char* sname, Mediator* m) : Nation(sname, m)  
;

class England : public Nation

public:
    England(const char* sname, Mediator* m) : Nation(sname, m)  
;


void TestMediator();

#endif

/*
* file: Mediator.cpp
* brief: Created by night at 2016.12.07
*/

#include "Mediator.h"

void UnitedNationsMediator::Send(Nation* member, const char* msg) 
    for (list<Nation*>::iterator itr = members.begin(); itr != members.end(); itr++) 
        (*itr)->Notify(member->name, msg);
    



void TestMediator()

    UnitedNationsMediator* mediator = new UnitedNationsMediator();
    China* china = new China("China", mediator);
    mediator->Register(china);

    USA* usa = new USA("USA", mediator);
    mediator->Register(usa);

    England* england = new England("England", mediator);
    mediator->Register(england);

    china->Send("This is from China!");
    cout << endl;

    usa->Send("This is from USA!");
    cout << endl;

    // destroy ...
    delete mediator;
    mediator = NULL;
    delete china;
    china = NULL;
    delete usa;
    usa = NULL;
    delete england;
    england = NULL;


输出结果:

China   <-- China:      This is from China!
USA     <-- China:      This is from China!
England <-- China:      This is from China!

China   <-- USA:        This is from USA!
USA     <-- USA:        This is from USA!
England <-- USA:        This is from USA!

引用

  1. 《设计模式:可复用面向对象软件的基础》

以上是关于设计模式一日一练:中介者模式(Mediator)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式-中介者模式(Mediator)

设计模式---接口隔离模式之中介者模式(Mediator)

20行为型模式之中介者模式

中介者模式-Mediator

设计模式之中介者模式 Mediator

中介者模式(Mediator Pattern)