最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++設(shè)計(jì)模式之中介者模式

 更新時(shí)間:2014年10月09日 08:39:56   作者:果凍想  
這篇文章主要介紹了C++設(shè)計(jì)模式之中介者模式,本文講解了什么是中介者模式、中介者模式的使用場(chǎng)合、中介者模式的優(yōu)缺點(diǎn)等內(nèi)容,需要的朋友可以參考下

前言

我們都知道,這個(gè)國(guó)際政治是一門(mén)很深的學(xué)問(wèn),不玩政治的人是搞不懂的。那么多的國(guó)家,國(guó)家之間的關(guān)系又及其復(fù)雜;就好比現(xiàn)在,美國(guó)和中國(guó)有經(jīng)濟(jì)利益關(guān)系,美國(guó)又和日本有盟友關(guān)系,朝鮮又和中國(guó)有說(shuō)不清道不明的關(guān)系;這些復(fù)雜的關(guān)系,稍微處理不好,就可能引發(fā)局部戰(zhàn)爭(zhēng),更有可能引發(fā)第三次世界大戰(zhàn)。如果出現(xiàn)了國(guó)與國(guó)之間出現(xiàn)了利益糾紛,那么該怎么辦呢?這個(gè)時(shí)候,聯(lián)合國(guó)出現(xiàn)了。聯(lián)合國(guó)就是一個(gè)處理國(guó)與國(guó)之間糾紛的中介者。

中介者模式

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書(shū)中對(duì)中介者模式是這樣說(shuō)的:用一個(gè)中介對(duì)象來(lái)封裝一系列的對(duì)象交互。中介者使各對(duì)象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。

我們都知道,面向?qū)ο笤O(shè)計(jì)鼓勵(lì)將行為分布到各個(gè)對(duì)象中。但是,這種分布可能會(huì)導(dǎo)致對(duì)象間有許多連接。在最壞的情況下,每一個(gè)對(duì)象都知道其他所有對(duì)象,就造成了復(fù)雜的關(guān)聯(lián)關(guān)系。雖然將一個(gè)系統(tǒng)分割成許多對(duì)象通??梢栽鰪?qiáng)可復(fù)用性,但是對(duì)象間相互連接的激增又會(huì)降低其可復(fù)用性。大量的相互連接使得一個(gè)對(duì)象似乎不太可能在沒(méi)有其他對(duì)象的支持下工作,這樣使得系統(tǒng)表現(xiàn)為一個(gè)不可分割的整體。而且,對(duì)系統(tǒng)的行為進(jìn)行任何較大的改動(dòng)都十分困難,因?yàn)樾袨楸环植荚谠S多對(duì)象中。結(jié)果是,你可能不得不定義很多子類(lèi)以定制系統(tǒng)的行為。

問(wèn)題再回到聯(lián)合國(guó)的問(wèn)題上來(lái),在聯(lián)合國(guó)還沒(méi)有成立時(shí),國(guó)與國(guó)之間的關(guān)系是這樣的:

當(dāng)聯(lián)合國(guó)成立以后,國(guó)與國(guó)之間出現(xiàn)糾紛時(shí),是這樣的:

聯(lián)合國(guó)的成立,讓很多關(guān)系簡(jiǎn)單化了,讓問(wèn)題的處理也簡(jiǎn)單化了,使國(guó)與國(guó)之間因?yàn)榧m紛產(chǎn)生摩擦的幾率減小了,讓世界更和平了。

UML類(lèi)圖

Mediator:中介者,它定義了一個(gè)接口用于與各個(gè)Colleague對(duì)象通信;
ConcreteMediator:具體的中介者,它通過(guò)協(xié)調(diào)各Colleague對(duì)象實(shí)現(xiàn)協(xié)作行為;并了解和維護(hù)它的各個(gè)Colleague;
Colleague:同事類(lèi),每一個(gè)同事類(lèi)都知道它的中介者對(duì)象;每一個(gè)同時(shí)對(duì)象在需要與其他的同事通信的時(shí)候,而是與它的中介者通信。

它們之間是按照以下方式進(jìn)行協(xié)作的:
同事向一個(gè)中介者對(duì)象發(fā)送和接收請(qǐng)求。中介者在各同事間適當(dāng)?shù)剞D(zhuǎn)發(fā)請(qǐng)求以實(shí)現(xiàn)協(xié)作行為。

使用場(chǎng)合

在下列情況下使用中介者模式:

1.一組對(duì)象以定義良好但是復(fù)雜的方式進(jìn)行通信。產(chǎn)生的相互依賴(lài)關(guān)系結(jié)構(gòu)混亂且難以理解;
2.一個(gè)對(duì)象引用其他很多對(duì)象并且直接與這些對(duì)象通信,導(dǎo)致難以復(fù)用該對(duì)象;
3.想定制一個(gè)分布在多個(gè)類(lèi)中的行為,而又不想生成太多的子類(lèi)。

優(yōu)缺點(diǎn)

1.減少了子類(lèi)生成,Mediator將原本分布于多個(gè)對(duì)象間的行為集中在一起。改變這些行為只需生成Meditator的子類(lèi)即可。這樣各個(gè)Colleague類(lèi)可被重用;

2.它將各Colleague解耦,Mediator有利于各Colleague間的松耦合。你可以獨(dú)立的改變和復(fù)用各Colleague類(lèi)和Mediator類(lèi);

3.它簡(jiǎn)化了對(duì)象協(xié)議,用Mediator和Colleague間的一對(duì)多的交互來(lái)代替多對(duì)多的交互。一對(duì)多的關(guān)系更容易理解、維護(hù)和擴(kuò)展;

4.它對(duì)對(duì)象如何協(xié)作進(jìn)行了抽象,將中介作為一個(gè)獨(dú)立的概念并將其封裝在一個(gè)對(duì)象中,使你將注意力從對(duì)象各自本身的行為轉(zhuǎn)移到它們之間的交互上來(lái)。這有助于弄清楚一個(gè)系統(tǒng)中的對(duì)象是如何交互的;

5.它使控制集中化,中介者模式將交互的復(fù)雜性變?yōu)橹薪檎叩膹?fù)雜性。因?yàn)橹薪檎叻庋b了協(xié)議,它可能變得比任一個(gè)Colleague都復(fù)雜。這可能使得中介者自身成為一個(gè)難于維護(hù)的龐然大物。

代碼實(shí)現(xiàn)

實(shí)現(xiàn)一個(gè)通用的中介者模式:

復(fù)制代碼 代碼如下:

#include <iostream>
using namespace std;
 
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
 
class Mediator;
 
class Colleague
{
public:
     Colleague(Mediator *pMediator) : m_pMediator(pMediator){}
 
     virtual void Send(wchar_t *message) = 0;
 
protected:
     Mediator *m_pMediator;
};
 
class ConcreteColleague1 : public Colleague
{
public:
     ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator){}
 
     void Send(wchar_t *message);
 
     void Notify(wchar_t *message)
     {
          wcout<<message<<endl;
     }
};
 
class ConcreteColleague2 : public Colleague
{
public:
     ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator){}
 
     void Send(wchar_t *message);
 
     void Notify(wchar_t *message)
     {
          cout<<"ConcreteColleague2 is handling the message."<<endl;
          wcout<<message<<endl;
     }
};
 
class Mediator
{
public:
     virtual void Sent(wchar_t *message, Colleague *pColleague) = 0;
};
 
class ConcreteMediator : public Mediator
{
public:
     // The mediator forward the message
     void Sent(wchar_t *message, Colleague *pColleague)
     {
          ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);
          if (pConcreteColleague1)
          {
               cout<<"The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2"<<endl;
               if (m_pColleague2)
               {
                    m_pColleague2->Notify(message);
               }
          }
          else
          {
               if (m_pColleague1)
               {
                    m_pColleague1->Notify(message);
               }
          }
     }
 
     void SetColleague1(Colleague *pColleague)
     {
          m_pColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);
     }
 
     void SetColleague2(Colleague *pColleague)
     {
          m_pColleague2 = dynamic_cast<ConcreteColleague2 *>(pColleague);
     }
 
private:
     // The Mediator knows all the Colleague
     ConcreteColleague1 *m_pColleague1;
     ConcreteColleague2 *m_pColleague2;
};
 
void ConcreteColleague1::Send(wchar_t *message)
{
     // The second parameter mark where the message comes from
     m_pMediator->Sent(message, this);
}
 
void ConcreteColleague2::Send(wchar_t *message)
{
     m_pMediator->Sent(message, this);
}
 
int main()
{
     // Create the mediator
     Mediator *pMediator = new ConcreteMediator();
 
     Colleague *pColleague1 = new ConcreteColleague1(pMediator);
     Colleague *pColleague2 = new ConcreteColleague2(pMediator);
 
     ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);
     pConcreteMediator->SetColleague1(pColleague1);
     pConcreteMediator->SetColleague2(pColleague2);
 
     wchar_t message[260] = L"Where are you from?";
     pColleague1->Send(message);
 
     return 0;
}

與外觀模式的區(qū)別

我在看中介者模式時(shí),第一眼就感覺(jué)中介者模式和外觀模式超級(jí)像。外觀模式與中介者模式的不同之處在于它是對(duì)一個(gè)對(duì)象子系統(tǒng)進(jìn)行抽象,從而提供了一個(gè)更為方便的接口;外觀模式的協(xié)議是單向的,即外觀模式向子系統(tǒng)提出請(qǐng)求,但反過(guò)來(lái)則不行;而對(duì)于中介者模式,是進(jìn)行多個(gè)對(duì)象之間的協(xié)作,通信是多向的。

總結(jié)

中介者模式是一個(gè)比較簡(jiǎn)單的設(shè)計(jì)模式,我在這里對(duì)中介者模式進(jìn)行總結(jié),希望對(duì)大家有用。這篇也是蛇年的最后一篇文章了。馬年見(jiàn)了,在這里提前祝愿大家馬年快樂(lè)。

相關(guān)文章

  • opencv3/C++ 離散余弦變換DCT方式

    opencv3/C++ 離散余弦變換DCT方式

    今天小編就為大家分享一篇opencv3/C++ 離散余弦變換DCT方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • C++實(shí)現(xiàn)LeetCode(142.單鏈表中的環(huán)之二)

    C++實(shí)現(xiàn)LeetCode(142.單鏈表中的環(huán)之二)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(142.單鏈表中的環(huán)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談分詞器Tokenizer

    淺談分詞器Tokenizer

    分詞器的工作就是分解文本流成詞(tokens).在這個(gè)文本中,每一個(gè)token都是這些字符的一個(gè)子序列。一個(gè)分析器(analyzer)必須知道它所配置的字段,但是tokenizer不需要,分詞器(tokenizer)從一個(gè)字符流(reader)讀取數(shù)據(jù),生成一個(gè)Token對(duì)象(TokenStream)的序列
    2021-06-06
  • Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼

    Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼

    本篇文章是對(duì)在Linux下使用c語(yǔ)言獲取進(jìn)程退出值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 約瑟夫經(jīng)典問(wèn)題擴(kuò)展成雙向約瑟夫問(wèn)題

    約瑟夫經(jīng)典問(wèn)題擴(kuò)展成雙向約瑟夫問(wèn)題

    今天小編就為大家分享一篇關(guān)于約瑟夫經(jīng)典問(wèn)題擴(kuò)展成雙向約瑟夫問(wèn)題,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例

    C語(yǔ)言實(shí)現(xiàn)的順序表功能完整實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)的順序表功能,結(jié)合完整實(shí)例形式分析了C語(yǔ)言順序表的創(chuàng)建、添加、刪除、排序、合并等相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • C/C++調(diào)用Fortran的DLL的操作過(guò)程

    C/C++調(diào)用Fortran的DLL的操作過(guò)程

    這篇文章主要介紹了C/C++調(diào)用Fortran的DLL,本文以一個(gè)簡(jiǎn)單的加法器為例,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    數(shù)據(jù)結(jié)構(gòu)作為每一個(gè)IT人不可回避的問(wèn)題,本文基于C++編寫(xiě),下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)

    C語(yǔ)言Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)

    iniparser是針對(duì)INI文件的解析器。ini文件則是一些系統(tǒng)或者軟件的配置文件。本文就來(lái)介紹一下如何利用Iniparser庫(kù)實(shí)現(xiàn)ini文件讀寫(xiě)吧
    2023-03-03
  • C++實(shí)現(xiàn)LeetCode(120.三角形)

    C++實(shí)現(xiàn)LeetCode(120.三角形)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(120.三角形),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07

最新評(píng)論

石景山区| 介休市| 嘉黎县| 通州区| 河东区| 无极县| 郸城县| 延长县| 平原县| 缙云县| 都江堰市| 斗六市| 岳阳县| 安多县| 门源| 敖汉旗| 龙南县| 县级市| 吉水县| 富裕县| 宁强县| 惠东县| 东城区| 曲松县| 稷山县| 元谋县| 涞源县| 信丰县| 马关县| 瑞丽市| 卫辉市| 邵阳市| 南阳市| 光山县| 大关县| 报价| 临沭县| 双桥区| 宜阳县| 永春县| 繁峙县|