青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

No sub title

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

轉載自:http://patmusing.blog.163.com/blog/static/1358349602010150177996/

“Define an object that encapsulates how a set of objects interact. Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction” – GoF

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

Object-oriented design encourages the distribution of behavior among objects. Such distribution can result in an object structure with many connections between objects; in the worst case, every object ends up knowing about every other.

Though partitioning a system into many objects generally enhances reusability, proliferating interconnections tend to reduce it again. Lots of interconnections make it less likely that an object can work without the support of others—the system acts as though it were monolithic. Moreover, it can be difficult to change the system's behavior in any significant way, since behavior is distributed among many objects. As a result, you may be forced to define many subclasses to customize the system's behavior.

在軟件構建過程中,經(jīng)常會出現(xiàn)多個對象相互關聯(lián)交互的情況,對象之間常常會維持一種復雜的引用關系,如果遇到一些需求的更改,這種直接的引用關系將面臨不斷的變化。在這種情況下,我們可以使用一個中介對象來管理對象間的關聯(lián)關系,避免相互交互的對象之間的緊耦合的引用關系,從而更好地駕馭變化。

依賴關系的轉化示例:

20. C++實現(xiàn)Behavioral - Mediator模式 - 玄機逸士 - 玄機逸士博客

1. 5個類相互之間兩兩相互依賴; 1. 5各類彼此之間沒有直接的依賴關系;

2. 共有10個關系需要維護; 2. 共有5個關系需要維護;

3. 如果任意其中一個類發(fā)生了改 3. 如果任意其中一個類發(fā)生了改變,那么

變,那么另外4個類,度需要 只需要修改Mediator即可,其它4

隨之改變; 類可以維持不變;

4. 如果要增加一個新類F,那么需要 4. 如果要增加一個類F,那么要維護的關系

維護的關系數(shù)量將變?yōu)?/span>15,并且 數(shù)量將變?yōu)?/span>6,原有的5個類不需要做任

原有的5個類均需要做相應改變。 和改變,僅需改變Mediator即可。

Applicability:

- A set of objects communicate in well-defined but complex ways. The resulting interdependencies are unstructed and difficult to understand.

- Resuing an object is difficult because it refers to and communicates with many other objects.

- A behavior that’s distributed between several classes should be customizable without a lot of subclassing.

Participants:

- Mediator:

Defines an interface for communicating with Colleague objects.

- ConcreteMediator:

Implements cooperative behavior by coordinatiing Colleague objects.

Knows and maintains its colleagues.

- Colleagues

Each Colleague class knows its Mediator object.

Each colleague communicates with its mediator whenever it would have otherwise communicated with another colleague.

業(yè)務示例:假定有如下圖所示的界面:

20. C++實現(xiàn)Behavioral - Mediator模式 - 玄機逸士 - 玄機逸士博客

RadioButtons包含了4個單選,CheckBoxes包含了4個復選框,ComboBox中有4個選項。先假定:

如果RadioButtons中選擇了Roption1,那么CheckBoxes中的Coption1就會被選中,ComboBox中的ComOption1就會被選中;如果CheckBoxes中的COption1被選中,那么RadioButtons中的ROption1ComboBox中的ComOption1就會被選中;如果ComboBox中的ComOption1被選中,那么RadioButtons中的ROption1CheckBoxes中的Coption1就會被選中。以此類推。另外在這里,RadioButtons和其中的單選按鈕被看成是一個對象,4個單選按鈕可視為RadioButtons4個狀態(tài);CheckBoxesComboBox也是如此。

還有一個假設:

CheckBoxesComboBox分別只能選擇其中一項(復選框也不能復選,與其實際功能不符,純?yōu)檠芯坑?/span>)

優(yōu)點:

- 將多對多的關系轉化為一對多的關系,使對象之間的關系更易于維護;

- 將對象的行為和協(xié)作抽象化。

缺點:

- 雖然降低了同事類的復雜性,但增加了調停者對象的復雜性;

- 同事類的復用性是以調停者類的不可復用為代價的。

C++實現(xiàn)代碼:

// Mediator.h

#include <string>

#include <iostream>

using namespace std;

// 前置聲明

class AbstractColleague;

// 抽象調停類

class AbstractMediator

{

public:

// 通知"同事"類,其參數(shù)aac為引發(fā)事件的對象

virtual void notify_colleagues(AbstractColleague *aac) = 0;

public:

virtual ~AbstractMediator()

{

cout << "in the destructor of AbstractMediator..." << endl;

}

};

// 抽象"同事"

class AbstractColleague

{

protected:

AbstractMediator *mediator;

public:

AbstractColleague(AbstractMediator *mediator)

{

this->mediator = mediator;

}

~AbstractColleague()

{

cout << "in the destructor of AbstractColleague..." << endl;

}

public:

virtual void set_item_true(int i) = 0;

virtual int get_true_item() = 0;

void on_change(AbstractColleague *aac)

{

mediator->notify_colleagues(aac);

}

};

// 單選按鈕

class RadioButtons : public AbstractColleague

{

private:

bool rButton1;

bool rButton2;

bool rButton3;

bool rButton4;

public:

RadioButtons(AbstractMediator *mediator) : AbstractColleague(mediator)

{

rButton1 = false;

rButton2 = false;

rButton3 = false;

rButton4 = false;

}

~RadioButtons()

{

cout << "in the destructor of RadioButtons..." << endl;

}

public:

void set_item_true(int i)

{

rButton1 = false;

rButton2 = false;

rButton3 = false;

rButton4 = false;

switch(i)

{

case 1:

rButton1 = true;

break;

case 2:

rButton2 = true;

break;

case 3:

rButton3 = true;

break;

case 4:

rButton4 = true;

break;

default:

rButton1 = true;

}

}

int get_true_item()

{

if(rButton1) return 1;

if(rButton2) return 2;

if(rButton3) return 3;

if(rButton4) return 4;

return 1;

}

void onRadioButtonClick()

{

on_change(this);

}

};

// 復選框

class CheckBoxes : public AbstractColleague

{

private:

bool cBox1;

bool cBox2;

bool cBox3;

bool cBox4;

public:

CheckBoxes(AbstractMediator *mediator) : AbstractColleague(mediator)

{

cBox1 = false;

cBox2 = false;

cBox3 = false;

cBox4 = false;

}

~CheckBoxes()

{

cout << "in the destructor of CheckBoxes..." << endl;

}

public:

void set_item_true(int i)

{

cBox1 = false;

cBox2 = false;

cBox3 = false;

cBox4 = false;

switch(i)

{

case 1:

cBox1 = true;

break;

case 2:

cBox2 = true;

break;

case 3:

cBox3 = true;

break;

case 4:

cBox4 = true;

break;

default:

cBox1 = true;

}

}

int get_true_item()

{

if(cBox1) return 1;

if(cBox2) return 2;

if(cBox3) return 3;

if(cBox4) return 4;

return 1;

}

void onCheckBoxClick()

{

on_change(this);

}

};

// 下拉框

class ComboBox : public AbstractColleague

{

private:

bool cOpt1;

bool cOpt2;

bool cOpt3;

bool cOpt4;

public:

ComboBox(AbstractMediator *mediator) : AbstractColleague(mediator)

{

cOpt1 = false;

cOpt2 = false;

cOpt3 = false;

cOpt4 = false;

}

~ComboBox()

{

cout << "in the destructor of ComboxBox..." << endl;

}

public:

void set_item_true(int i)

{

cOpt1 = false;

cOpt2 = false;

cOpt3 = false;

cOpt4 = false;

switch(i)

{

case 1:

cOpt1 = true;

break;

case 2:

cOpt2 = true;

break;

case 3:

cOpt3 = true;

break;

case 4:

cOpt4 = true;

break;

default:

cOpt1 = true;

}

}

int get_true_item()

{

if(cOpt1) return 1;

if(cOpt2) return 2;

if(cOpt3) return 3;

if(cOpt4) return 4;

return 1;

}

void onComboBoxClick()

{

on_change(this);

}

};

// 具體調停類

class ConcreteMediator : public AbstractMediator

{

private:

RadioButtons* rbt;

CheckBoxes* cbx;

ComboBox* cbo;

public:

~ConcreteMediator()

{

cout << "in the destructor of ConcreteMediator..." << endl;

}

void set_colleagues(RadioButtons* rbt, CheckBoxes* cbx, ComboBox* cbo)

{

this->rbt = rbt;

this->cbx = cbx;

this->cbo = cbo;

}

void notify_colleagues(AbstractColleague *aac)

{

int i = aac->get_true_item();

rbt->set_item_true(i);

cbx->set_item_true(i);

cbo->set_item_true(i);

}

};

// Mediator.cpp

#include "Mediator.h"

int main(int argc, char **argv)

{

AbstractMediator* mediator = new ConcreteMediator();

RadioButtons* rbt = new RadioButtons(mediator);

CheckBoxes* cbx = new CheckBoxes(mediator);

ComboBox* cbo = new ComboBox(mediator);

dynamic_cast<ConcreteMediator*>(mediator)->set_colleagues(rbt, cbx, cbo);

// 下面兩行模擬RadioButtonsonClick事件觸發(fā),并選中第個單選按鈕

rbt->set_item_true(1);

rbt->onRadioButtonClick();

cout << "Event triggered by the No.1 item of RadioButtons" << endl;

cout << "rButton" << rbt->get_true_item() << " \tis selected!" << endl;

cout << "cBox" << cbx->get_true_item() << " \t\tis selected accordingly!" << endl;

cout << "cOpt" << cbo->get_true_item() << " \t\tis selected accordingly!" << endl;

cout << "------------------------------------------------------" << endl;

// 下面兩行模擬CheckBoxesonClick事件觸發(fā),并選中第個復選框

cbx->set_item_true(2);

cbx->onCheckBoxClick();

cout << "Event triggered by the No.2 item of CheckBoxes" << endl;

cout << "rButton" << rbt->get_true_item() << " \tis selected accordingly!" << endl;

cout << "cBox" << cbx->get_true_item() << " \t\tis selected!" << endl;

cout << "cOpt" << cbo->get_true_item() << " \t\tis selected accordingly!" << endl;

cout << "------------------------------------------------------" << endl;

// 下面兩行模擬ComboBoxonClick事件觸發(fā),并選中第個選項

cbo->set_item_true(3);

cbo->onComboBoxClick();

cout << "Event triggered by the No.3 item of ComboBox" << endl;

cout << "rButton" << rbt->get_true_item() << " \tis selected accordingly!" << endl;

cout << "cBox" << cbx->get_true_item() << " \t\tis selected accordingly!" << endl;

cout << "cOpt" << cbo->get_true_item() << " \t\tis selected!" << endl;

cout << "------------------------------------------------------" << endl;

delete mediator;

delete rbt;

delete cbx;

delete cbo;

return 0;

}

運行結果:

Event triggered by the No.1 item of RadioButtons

rButton1 is selected!

cBox1 is selected accordingly!

cOpt1 is selected accordingly!

------------------------------------------------------

Event triggered by the No.2 item of CheckBoxes

rButton2 is selected accordingly!

cBox2 is selected!

cOpt2 is selected accordingly!

------------------------------------------------------

Event triggered by the No.3 item of ComboBox

rButton3 is selected accordingly!

cBox3 is selected accordingly!

cOpt3 is selected!

------------------------------------------------------

in the destructor of ConcreteMediator...

in the destructor of AbstractMediator...

in the destructor of RadioButtons...

in the destructor of AbstractColleague...

in the destructor of CheckBoxes...

in the destructor of AbstractColleague...

in the destructor of ComboxBox...

in the destructor of AbstractColleague...

上述程序的UML類圖:

20. C++實現(xiàn)Behavioral - Mediator模式 - 玄機逸士 - 玄機逸士博客



posted on 2013-03-08 14:33 Jacc.Kim 閱讀(199) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美福利一区二区| 一区二区三区产品免费精品久久75| 久久精品一区二区三区中文字幕| 久久精品国产2020观看福利| 黄色综合网站| 欧美福利一区二区三区| 一区二区高清视频| 久久激情视频免费观看| 亚洲国产精品www| 欧美日韩在线一区二区三区| 午夜精品久久久久久久男人的天堂| 久久人人爽人人| 亚洲精品专区| 国产伦精品一区二区三区照片91 | 伊人精品视频| 欧美日韩国产成人在线观看| 在线一区观看| 美腿丝袜亚洲色图| 亚洲一级片在线看| 永久91嫩草亚洲精品人人| 欧美人成在线| 欧美亚洲在线| 日韩亚洲精品视频| 欧美成年视频| 欧美在线观看一区| 99精品欧美| 在线播放日韩专区| 国产精品日本一区二区| 女女同性女同一区二区三区91| 亚洲午夜精品网| 欧美激情中文不卡| 久久福利电影| 亚洲在线1234| 一本久道久久综合狠狠爱| 国产一区视频在线观看免费| 欧美精品一区视频| 久久久久国产一区二区三区| 亚洲一品av免费观看| 亚洲国产成人精品女人久久久| 午夜精品一区二区三区在线视| 亚洲国产成人91精品| 国产视频一区在线观看一区免费| 欧美日韩国产免费观看| 免费毛片一区二区三区久久久| 欧美亚洲视频在线看网址| 一道本一区二区| 91久久国产综合久久91精品网站| 久久男人资源视频| 久久精品亚洲精品国产欧美kt∨| 亚洲天堂第二页| 一区电影在线观看| 亚洲精品国产精品国自产观看浪潮| 国产综合av| 国产一区在线观看视频| 国产伦精品一区二区三区照片91 | 亚洲精品乱码久久久久久蜜桃91| 猫咪成人在线观看| 久久亚洲不卡| 久久精品国产综合| 欧美自拍偷拍| 小嫩嫩精品导航| 亚洲欧美另类国产| 亚洲欧美国产不卡| 亚洲欧美日韩中文播放| 亚洲天天影视| 亚洲欧美韩国| 新67194成人永久网站| 午夜一区不卡| 久久福利资源站| 久久婷婷国产综合国色天香| 久久精品欧美日韩| 久久噜噜亚洲综合| 噜噜噜噜噜久久久久久91| 久久漫画官网| 欧美电影美腿模特1979在线看| 欧美激情精品| 亚洲人成在线播放| 一本色道久久精品| 亚洲一区精品电影| 久久国产福利| 美女日韩欧美| 欧美日韩视频专区在线播放 | 亚洲精品一线二线三线无人区| 裸体丰满少妇做受久久99精品| 麻豆久久久9性大片| 欧美岛国在线观看| 亚洲人成啪啪网站| 亚洲婷婷国产精品电影人久久| 亚洲影院免费观看| 欧美一级专区| 麻豆免费精品视频| 欧美日韩精品二区| 国产小视频国产精品| 一区二区亚洲欧洲国产日韩| 亚洲人午夜精品| 亚洲一二三区在线| 久久久久国内| 亚洲激情另类| 亚洲欧美国产制服动漫| 久久视频在线看| 欧美精品国产| 国产日韩欧美二区| 日韩视频一区二区三区| 欧美一区二区三区在线播放| 美女诱惑黄网站一区| 亚洲精品一区二区三区不| 亚洲欧美日韩中文播放| 欧美成人福利视频| 国产欧美精品一区二区色综合 | 一区二区三区日韩| 久久精品成人| 亚洲看片一区| 久久精品日韩一区二区三区| 欧美黑人国产人伦爽爽爽| 国产精品最新自拍| 91久久综合| 久久精品主播| 亚洲美女毛片| 久久字幕精品一区| 国产精品美女999| 亚洲区国产区| 久久久久久香蕉网| 在线亚洲自拍| 欧美另类在线播放| 精品91免费| 久久国产高清| 亚洲视频综合| 欧美伦理a级免费电影| 精品成人久久| 欧美在线视频一区二区| 亚洲精品一区二区网址| 久久一区二区三区超碰国产精品| 国产精品入口日韩视频大尺度| 亚洲毛片一区| 欧美成人中文| 久久9热精品视频| 国产欧美日韩免费看aⅴ视频| 亚洲精品日韩欧美| 欧美xxx在线观看| 欧美自拍偷拍午夜视频| 国产乱码精品| 亚欧成人精品| 亚洲自拍电影| 国产精品久线观看视频| 正在播放亚洲| 亚洲精品在线免费| 欧美精品在线网站| 日韩亚洲国产欧美| 91久久黄色| 欧美成人xxx| 亚洲精品在线视频| 亚洲激情另类| 欧美人妖在线观看| 日韩亚洲欧美一区二区三区| 亚洲国产天堂久久国产91| 久久综合网hezyo| 91久久精品国产91久久| 欧美二区乱c少妇| 欧美成人性生活| 亚洲精品在线三区| 亚洲精品美女久久7777777| 欧美—级高清免费播放| 亚洲精品永久免费| 亚洲精品五月天| 国产精品成人免费视频| 西瓜成人精品人成网站| 性欧美精品高清| 在线观看日韩av电影| 欧美国产欧美亚州国产日韩mv天天看完整| 久久久久国产一区二区| 亚洲国产高清自拍| 亚洲国产精品久久久久秋霞不卡| 欧美激情视频网站| 亚洲与欧洲av电影| 欧美亚洲三级| 亚洲国产精品123| 日韩午夜一区| 国产精品入口麻豆原神| 久久视频在线免费观看| 麻豆精品91| 在线视频中文亚洲| 亚洲一区在线播放| 国产精品日日摸夜夜摸av| 久久狠狠久久综合桃花| 久久久久久国产精品一区| 亚洲国产网站| 中文av一区二区| 国产一区二区三区电影在线观看| 老司机凹凸av亚洲导航| 欧美国产日韩一区二区三区| 亚洲午夜一区二区| 久久av一区二区三区| 亚洲精品久久久一区二区三区| 日韩视频免费看| 国产婷婷97碰碰久久人人蜜臀| 欧美成人亚洲成人| 国产精品国产三级国产普通话99 | 亚洲欧洲精品一区二区精品久久久| 亚洲国产精品热久久| 国产精品久久久久婷婷|