程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++設計形式當中介者形式

C++設計形式當中介者形式

編輯:關於C++

C++設計形式當中介者形式。本站提示廣大學習愛好者:(C++設計形式當中介者形式)文章只能為提供參考,不一定能成為您想要的結果。以下是C++設計形式當中介者形式正文


媒介

我們都曉得,這個國際政治是一門很深的學問,不玩政治的人是弄不懂的。那末多的國度,國度之間的關系又及其龐雜;就比如如今,美國和中國有經濟好處關系,美國又和日本有盟友關系,朝鮮又和中國有說不清道不明的關系;這些龐雜的關系,略微處置欠好,便可能激發部分戰斗,更有能夠激發第三次世界年夜戰。假如湧現了國與國之間湧現了好處膠葛,那末該怎樣辦呢?這個時刻,結合國湧現了。結合國就是一個處置國與國之間膠葛的中介者。

中介者形式

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

與外不雅形式的差別

我在看中介者形式時,第一眼就感到中介者形式和外不雅形式超等像。外不雅形式與中介者形式的分歧的地方在於它是對一個對象子體系停止籠統,從而供給了一個更加便利的接口;外不雅形式的協定是單向的,即外不雅形式向子體系提出要求,但反過去則不可;而關於中介者形式,是停止多個對象之間的協作,通訊是多向的。

總結

中介者形式是一個比擬簡略的設計形式,我在這裡對中介者形式停止總結,願望對年夜家有效。這篇也是蛇年的最初一篇文章了。馬年見了,在這裡提早祝賀年夜家馬年快活。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved