亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++設計模式之中介者模式

2020-01-26 15:16:08
字體:
來源:轉載
供稿:網友

前言

我們都知道,這個國際政治是一門很深的學問,不玩政治的人是搞不懂的。那么多的國家,國家之間的關系又及其復雜;就好比現在,美國和中國有經濟利益關系,美國又和日本有盟友關系,朝鮮又和中國有說不清道不明的關系;這些復雜的關系,稍微處理不好,就可能引發局部戰爭,更有可能引發第三次世界大戰。如果出現了國與國之間出現了利益糾紛,那么該怎么辦呢?這個時候,聯合國出現了。聯合國就是一個處理國與國之間糾紛的中介者。

中介者模式

在GOF的《設計模式:可復用面向對象軟件的基礎》一書中對中介者模式是這樣說的:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。

我們都知道,面向對象設計鼓勵將行為分布到各個對象中。但是,這種分布可能會導致對象間有許多連接。在最壞的情況下,每一個對象都知道其他所有對象,就造成了復雜的關聯關系。雖然將一個系統分割成許多對象通??梢栽鰪娍蓮陀眯?,但是對象間相互連接的激增又會降低其可復用性。大量的相互連接使得一個對象似乎不太可能在沒有其他對象的支持下工作,這樣使得系統表現為一個不可分割的整體。而且,對系統的行為進行任何較大的改動都十分困難,因為行為被分布在許多對象中。結果是,你可能不得不定義很多子類以定制系統的行為。

問題再回到聯合國的問題上來,在聯合國還沒有成立時,國與國之間的關系是這樣的:

當聯合國成立以后,國與國之間出現糾紛時,是這樣的:

聯合國的成立,讓很多關系簡單化了,讓問題的處理也簡單化了,使國與國之間因為糾紛產生摩擦的幾率減小了,讓世界更和平了。

UML類圖

Mediator:中介者,它定義了一個接口用于與各個Colleague對象通信;
ConcreteMediator:具體的中介者,它通過協調各Colleague對象實現協作行為;并了解和維護它的各個Colleague;
Colleague:同事類,每一個同事類都知道它的中介者對象;每一個同時對象在需要與其他的同事通信的時候,而是與它的中介者通信。

它們之間是按照以下方式進行協作的:
同事向一個中介者對象發送和接收請求。中介者在各同事間適當地轉發請求以實現協作行為。

使用場合

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

1.一組對象以定義良好但是復雜的方式進行通信。產生的相互依賴關系結構混亂且難以理解;
2.一個對象引用其他很多對象并且直接與這些對象通信,導致難以復用該對象;
3.想定制一個分布在多個類中的行為,而又不想生成太多的子類。

優缺點

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

2.它將各Colleague解耦,Mediator有利于各Colleague間的松耦合。你可以獨立的改變和復用各Colleague類和Mediator類;

3.它簡化了對象協議,用Mediator和Colleague間的一對多的交互來代替多對多的交互。一對多的關系更容易理解、維護和擴展;

4.它對對象如何協作進行了抽象,將中介作為一個獨立的概念并將其封裝在一個對象中,使你將注意力從對象各自本身的行為轉移到它們之間的交互上來。這有助于弄清楚一個系統中的對象是如何交互的;

5.它使控制集中化,中介者模式將交互的復雜性變為中介者的復雜性。因為中介者封裝了協議,它可能變得比任一個Colleague都復雜。這可能使得中介者自身成為一個難于維護的龐然大物。

代碼實現

實現一個通用的中介者模式:

復制代碼 代碼如下:

#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;
}

與外觀模式的區別

我在看中介者模式時,第一眼就感覺中介者模式和外觀模式超級像。外觀模式與中介者模式的不同之處在于它是對一個對象子系統進行抽象,從而提供了一個更為方便的接口;外觀模式的協議是單向的,即外觀模式向子系統提出請求,但反過來則不行;而對于中介者模式,是進行多個對象之間的協作,通信是多向的。

總結

中介者模式是一個比較簡單的設計模式,我在這里對中介者模式進行總結,希望對大家有用。這篇也是蛇年的最后一篇文章了。馬年見了,在這里提前祝愿大家馬年快樂。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
不卡中文字幕av| 欧美一区二区三区免费视| 97精品免费视频| 久热爱精品视频线路一| 成人午夜激情免费视频| 国产精品视频久久久久| 久久久精品免费| 九九热这里只有在线精品视| 98精品国产高清在线xxxx天堂| 一区二区三区回区在观看免费视频| 久久91精品国产91久久久| 蜜臀久久99精品久久久无需会员| 欧美中文字幕在线观看| 欧美亚洲第一区| 国产高清视频一区三区| 国产精品久久久久久久久久小说| 91久久国产精品| 国产精品嫩草影院一区二区| 68精品国产免费久久久久久婷婷| 久久99青青精品免费观看| 久久99视频免费| 久久91精品国产| 国产精品99导航| 欧美激情国产高清| 欧美成人免费全部观看天天性色| 最近2019中文字幕mv免费看| 亚洲成年人影院在线| 国产精品综合久久久| 久久久伊人欧美| 亚洲精品成人av| 国产91精品久久久| 欧美亚洲成人免费| 亚洲最大激情中文字幕| 亚洲人成电影网站色…| 亚洲一区二区少妇| 色偷偷偷综合中文字幕;dd| 欧美国产日韩xxxxx| 狠狠久久五月精品中文字幕| 国产精品白嫩美女在线观看| 国产成人精品电影| 成人国产精品久久久| 成人性生交大片免费看小说| 福利二区91精品bt7086| 国产精品免费视频xxxx| 爽爽爽爽爽爽爽成人免费观看| 亚洲最新av在线| 国产精品视频白浆免费视频| 5278欧美一区二区三区| 日韩男女性生活视频| 国产婷婷97碰碰久久人人蜜臀| 日韩不卡中文字幕| 国产日韩欧美影视| www欧美xxxx| 日韩av最新在线观看| 亚洲精品视频中文字幕| 精品亚洲一区二区三区在线观看| 啊v视频在线一区二区三区| 亚洲精品福利在线观看| 日韩精品免费综合视频在线播放| 国产日韩欧美在线播放| 伊人青青综合网站| 97视频在线观看免费高清完整版在线观看| 最新国产精品拍自在线播放| 欧美精品在线极品| 少妇高潮 亚洲精品| 久久人人爽亚洲精品天堂| 日韩电影免费观看中文字幕| 欧美激情综合色综合啪啪五月| 久久噜噜噜精品国产亚洲综合| 91精品久久久久久久久久入口| 国产不卡av在线免费观看| 亚洲色图日韩av| 国产精品老牛影院在线观看| 亚洲第一福利视频| 国产欧美日韩精品丝袜高跟鞋| 国产精品久久久久久av福利| 欧美视频二区36p| 久久久久久18| 国产精品一区二区av影院萌芽| 亚洲电影中文字幕| 91高清在线免费观看| 欧美做爰性生交视频| 色狠狠久久aa北条麻妃| 亚洲天堂男人天堂女人天堂| 国产精品网址在线| 在线中文字幕日韩| 久久久久久久激情视频| 在线看福利67194| 国产亚洲精品久久久久动| 久热精品视频在线观看一区| 日韩有码在线电影| 5252色成人免费视频| 久久久久久久久久久网站| 国产综合香蕉五月婷在线| 国产一区二区欧美日韩| 91精品国产综合久久久久久蜜臀| 亚洲久久久久久久久久久| 色综合色综合网色综合| 91久久国产婷婷一区二区| 国产精品av电影| 久久99热精品这里久久精品| 色婷婷**av毛片一区| 成人免费网视频| 亚洲美女性视频| 91网站在线免费观看| 欧美精品中文字幕一区| 亚洲人成网在线播放| 亚洲欧美另类国产| 69久久夜色精品国产7777| 久久久久久久久久久网站| 欧美xxxx做受欧美.88| 亚洲第一区中文字幕| 欧美激情精品久久久久久| 粉嫩老牛aⅴ一区二区三区| 日韩欧美aaa| 欧美精品videos性欧美| 精品国产一区二区在线| 欧美色xxxx| 亚洲图中文字幕| 成人在线国产精品| 高清欧美性猛交xxxx黑人猛交| 欧美极品少妇全裸体| 欧美日韩国产精品| 国产欧美日韩综合精品| 久久久亚洲国产天美传媒修理工| 亚洲人成电影网站色xx| 国模gogo一区二区大胆私拍| 欧美重口另类videos人妖| 国产一区二区三区丝袜| 国产精品丝袜久久久久久高清| 久久天天躁狠狠躁夜夜爽蜜月| 日韩电视剧免费观看网站| 久久国产精品视频| 亚洲风情亚aⅴ在线发布| 久久综合久久88| 国产精品va在线播放| 日韩亚洲精品视频| 久久久999精品免费| 国产欧美在线看| 成人免费看片视频| 在线精品高清中文字幕| 55夜色66夜色国产精品视频| 国产一区二区欧美日韩| 欧美激情极品视频| 国产精品高清在线观看| 久久久国产影院| 日本欧美一级片| 日韩av免费看| 成人做爰www免费看视频网站| 日产日韩在线亚洲欧美| 国产一区二区三区三区在线观看| 国外成人在线直播| 91日本在线视频| 亚洲日本成人女熟在线观看| 欧美一区亚洲一区| 中文字幕亚洲欧美日韩在线不卡| 日韩成人av网址| 黄色成人在线播放| 成人动漫网站在线观看| 68精品久久久久久欧美| 国产精品久久久久9999| 黑人巨大精品欧美一区二区一视频| 亚洲欧美成人一区二区在线电影| 国产精品日日摸夜夜添夜夜av|