1. 程式人生 > >設計模式(二十三)——中介者模式

設計模式(二十三)——中介者模式

設計模式 中介者模式

設計模式(二十三)——中介者模式

一、中介者模式簡介

1、中介者模式簡介

中介者模式用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

技術分享

中介者模式中,每個同事對象維護一個中介者,當要進行通信時,每個具體的同事直接向中介者發信息,至於信息發到哪裏,則由

中介者來決定。

中介者模式就是迪米特法則的一個典型應用在中介者模式中,通過創造出一個中介者對象,將系統中有關的對象所引用的其他對象數目減少到最少,使得一個對象與其同事之間的相互作用被這個對象與中介者對象之間的相互作用所取代。因此,中介者模式就是迪米特法則的一個典型應用。
通過引入中介者對象,可以將系統的網狀結構變成以中介者為中心的星形結構,中介者承擔了中轉作用和協調作用。中介者類是中介者模式的核心,對整個系統進行控制和協調,簡化了對象之間的交互,還可以對對象間的交互進行進一步的控制。

2、中介者模式角色

抽象中介者(Mediator):抽象中介者定義了同事對象到中介者對象的接口


具體中介者(ConcreteMediator): 實現抽象類的方法,需要知道所有具體同事類,並從具體同事接收消息,向具體同事對象發出命令。具體中介者通過協調各同事對象實現協作行為。
抽象同事類(Colleague class): 定義同事類接口定義各同事的公有方法.
具體同事類(ConcreteColleague): 實現抽象同事類中的方法。每一個同事類需要知道中介者對象;每個具體同事類只需要了解自己的行為,而不需要了解其他同事類的情況。每一個同事對象在需與其他的同事通信的時候,與它的中介者通信。同事類之間必須通過中介者才能進行消息傳遞。

3、中介者模式優缺點

中介者模式的優點

A適當地使用中介者模式可以避免同事類之間的過度耦合,使得各同事類之間可以相對獨立地使用。

B使用中介者模式可以將對象間一對多的關聯轉變為一對一的關聯,使對象間的關系易於理解和維護。

C使用中介者模式可以將對象的行為和協作進行抽象,能夠比較靈活的處理對象間的相互作用。

D使控制集中化中介者模式將交互的復雜性變為中介者的復雜性

中介者模式的缺點:

控制集中化,使得中介者變得復雜而難以維護。

4、中介者模式使用場景

中介者模式使用場景:

A、系統中對象之間存在復雜的引用關系,產生的相互依賴關系結構混亂且難以理解

B、一個對象由於引用了其他很多對象並且直接和這些對象通信,導致難以復用該對象

C、想通過一個中間類來封裝多個類中的行為,而又不想生成太多的子類

二、中介者模式實現

Mediator抽象中介者:

#ifndef MEDIATOR_H
#define MEDIATOR_H
#include <string>
#include <iostream>
using namespace std;
class Colleage;
 
//抽象中介者類
class Mediator
{
public:
    //向同事發送消息接口
    virtual void sendMessage(string msg, Colleage* colleage) = 0;
protected:
    Mediator(){}
};
 
#endif // MEDIATOR_H


ConcreteMediator具體中介者:

#ifndef CONCRETEMEDIATOR_H
#define CONCRETEMEDIATOR_H
#include "Mediator.h"
#include "Colleage.h"
 
//具體中介者類
class ConcreteMediator : public Mediator
{
public:
    virtual void sendMessage(string msg, Colleage* colleage)
    {
        if(colleage == m_pColleageA)
        {   //如果發送消息的為同事A,則由同事B接收消息
            m_pColleageB->getMessage(msg);
        }
        else if(colleage == m_pColleageB)
        {
            //如果發送消息的為同事B,則由同事A接收消息
            m_pColleageA->getMessage(msg);
        }
    }
    void setColleageA(Colleage* colleage)
    {
        m_pColleageA = colleage;
    }
    void setColleageB(Colleage* colleage)
    {
        m_pColleageB = colleage;
    }
private:
    Colleage* m_pColleageA;//同事A
    Colleage* m_pColleageB;//同事B
};
 
#endif // CONCRETEMEDIATOR_H


Colleage抽象同事:

#ifndef COLLEAGE_H
#define COLLEAGE_H
#include "Mediator.h"
 
//抽象同事類
class Colleage
{
public:
    //設置者
    void setMediator(Mediator* mediator)
    {
        m_pMediator = mediator;
    }
    //向中介者發送消息接口
    virtual void sendMessage(string msg) = 0;
    //從中介者獲取消息接口
    virtual void getMessage(string msg) = 0;
 
protected:
    Colleage(Mediator* mediator)
    {
        m_pMediator = mediator;
    }
protected:
    Mediator* m_pMediator;//中介
};
 
#endif // COLLEAGE_H


ConcreteColleageA具體同事類:

#ifndef CONCRETECOLLEAGEA_H
#define CONCRETECOLLEAGEA_H
#include "Colleage.h"
 
//具體同事類
class ConcreteColleageA : public Colleage
{
public:
    ConcreteColleageA(Mediator* mediator):Colleage(mediator)
    {
    }
    void sendMessage(string msg)
    {
        //要發送的消息由中介者轉發
        m_pMediator->sendMessage(msg, this);
    }
    void getMessage(string msg)
    {
        cout << "ConcreteColleageA receive an message: " << msg << endl;
    }
};
 
#endif // CONCRETECOLLEAGEA_H


ConcreteColleageB具體同事類:

#ifndef CONCRETECOLLEAGEB_H
#define CONCRETECOLLEAGEB_H
#include "Colleage.h"
 
//具體同事類
class ConcreteColleageB : public Colleage
{
public:
    ConcreteColleageB(Mediator* mediator):Colleage(mediator)
    {
    }
    void sendMessage(string msg)
    {
        //要發送的消息由中介者轉發
        m_pMediator->sendMessage(msg, this);
    }
    void getMessage(string msg)
    {
        cout << "ConcreteColleageB receive an message: " << msg << endl;
    }
};
 
#endif // CONCRETECOLLEAGEB_H


客戶調用程序:

#include "Mediator.h"
#include "Colleage.h"
#include "ConcreteMediator.h"
#include "ConcreteColleageA.h"
#include "ConcreteColleageB.h"
 
using namespace std;
 
int main()
{
    //創建中介者
    ConcreteMediator* mediator = new ConcreteMediator();
    //創建同事
    Colleage* coleageA = new ConcreteColleageA(mediator);
    Colleage* coleageB = new ConcreteColleageB(mediator);
    //設置中介者管理的同事對象
    mediator->setColleageA(coleageA);
    mediator->setColleageB(coleageB);
    //同事發送消息
    coleageA->sendMessage("A");
    coleageB->sendMessage("B");
 
    delete mediator;
    delete coleageA;
    delete coleageB;
    return 0;
}



本文出自 “生命不息,奮鬥不止” 博客,謝絕轉載!

設計模式(二十三)——中介者模式