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

積木

No sub title

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

常用鏈接

留言簿(1)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

轉(zhuǎn)載自: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.

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

依賴關(guān)系的轉(zhuǎn)化示例:

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

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

2. 共有10個關(guān)系需要維護; 2. 共有5個關(guān)系需要維護;

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

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

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

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

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

原有的5個類均需要做相應(yīng)改變。 和改變,僅需改變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è)務(wù)示例:假定有如下圖所示的界面:

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

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

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

還有一個假設(shè):

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

優(yōu)點:

- 將多對多的關(guān)系轉(zhuǎn)化為一對多的關(guān)系,使對象之間的關(guān)系更易于維護;

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

缺點:

- 雖然降低了同事類的復(fù)雜性,但增加了調(diào)停者對象的復(fù)雜性;

- 同事類的復(fù)用性是以調(diào)停者類的不可復(fù)用為代價的。

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

// Mediator.h

#include <string>

#include <iostream>

using namespace std;

// 前置聲明

class AbstractColleague;

// 抽象調(diào)停類

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);

}

};

// 復(fù)選框

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);

}

};

// 具體調(diào)停類

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ā),并選中第個復(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;

}

運行結(jié)果:

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 閱讀(196) 評論(0)  編輯 收藏 引用 所屬分類: 設(shè)計模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲社区在线观看| 亚洲电影一级黄| 午夜国产精品视频| 欧美激情免费在线| 欧美日韩在线直播| 亚洲色图自拍| 亚洲神马久久| 午夜精品剧场| 久久久午夜精品| 免费一区二区三区| 91久久中文| 亚洲国产综合视频在线观看| 亚洲黑丝在线| 亚洲一区三区在线观看| 亚洲专区在线视频| 噜噜噜久久亚洲精品国产品小说| 久久久久久亚洲精品中文字幕| 免费欧美视频| 国产精品美女久久福利网站| 国产日韩在线一区| 亚洲老司机av| 久久精品国产亚洲一区二区三区| 欧美成人在线免费视频| 亚洲精品乱码| 久久不射电影网| 欧美日韩三级视频| 一区二区在线不卡| 午夜欧美精品| 最新高清无码专区| 欧美在线www| 欧美偷拍另类| 亚洲麻豆国产自偷在线| 久久精品九九| 亚洲天堂偷拍| 欧美日韩精品在线| 亚洲激情视频在线播放| 久久精品99国产精品日本| 亚洲欧洲综合另类| 久久精品国产欧美激情 | 亚洲黄色小视频| 亚洲欧美日韩国产精品| 欧美老女人xx| 亚洲第一福利社区| 亚洲欧美综合另类中字| 亚洲国产日韩欧美在线99| 欧美一区二区三区久久精品茉莉花| 欧美精品日韩一区| 亚洲国产另类精品专区| 久久手机免费观看| 午夜影院日韩| 国产乱子伦一区二区三区国色天香| 一区二区国产精品| 亚洲第一福利视频| 久久久久高清| 欧美精品日本| 亚洲三级国产| 欧美激情亚洲另类| 久久资源在线| 欧美一级黄色网| 国产精品扒开腿做爽爽爽视频| 亚洲国产影院| 欧美激情一区二区三区在线视频观看| 欧美一区二视频在线免费观看| 欧美人与禽猛交乱配| 亚洲精品视频在线观看免费| 亚洲国产二区| 欧美日韩麻豆| 亚洲欧美国产毛片在线| 亚洲婷婷在线| 国产手机视频精品| 麻豆亚洲精品| 嫩草成人www欧美| 日韩视频中文| 一区二区三区精品久久久| 国产精品久久久久久五月尺| 篠田优中文在线播放第一区| 香蕉久久夜色精品| 国内精品美女av在线播放| 久久综合给合| 免费成年人欧美视频| 亚洲精品美女在线观看| 一区二区91| 国产精品一区二区在线观看不卡| 久久国产高清| 久久综合给合久久狠狠色| 亚洲人成在线观看| 一区二区精品国产| 国产亚洲精品久久久久动| 欧美成人自拍| 国产精品日韩高清| 久久综合成人精品亚洲另类欧美| 久久天天躁夜夜躁狠狠躁2022| 亚洲黄色影院| 亚洲视频免费观看| 在线国产欧美| 99国产精品久久久久久久成人热| 国产精品稀缺呦系列在线| 欧美激情一区二区三区四区| 国产精品电影网站| 麻豆成人在线| 欧美性生交xxxxx久久久| 蜜臀av国产精品久久久久| 欧美日韩亚洲高清| 麻豆freexxxx性91精品| 国产精品乱子久久久久| 欧美成人国产一区二区| 国产精品免费福利| 亚洲国产高清视频| 精品成人国产在线观看男人呻吟| 亚洲精品一区二区三区av| 一区二区在线看| 亚洲一区二区毛片| 99亚洲伊人久久精品影院红桃| 亚洲一区视频在线| 亚洲色图在线视频| 欧美成人dvd在线视频| 欧美中文在线视频| 欧美日韩综合在线| 你懂的视频欧美| 国产伦一区二区三区色一情| 亚洲伦理自拍| 亚洲激情在线| 亚洲乱码国产乱码精品精可以看 | 久久天天狠狠| 影音先锋在线一区| 牛牛国产精品| 一区二区三区免费观看| 免费在线观看精品| 久久综合九色九九| 亚洲国产精品久久久久秋霞影院| 亚洲一区高清| 99视频日韩| 欧美激情免费在线| 欧美.www| 在线日韩欧美| 久久久久在线观看| 久久在线91| 国产一区二区0| 久久国产99| 毛片一区二区三区| 在线免费不卡视频| 久久婷婷国产麻豆91天堂| 欧美777四色影视在线| 尤物九九久久国产精品的分类| 亚洲欧美日韩成人高清在线一区| 在线一区二区三区做爰视频网站 | 国产乱码精品一区二区三区五月婷| 亚洲免费激情| 亚洲欧美www| 国产精品自拍三区| 欧美一站二站| 蜜桃伊人久久| 一区二区三区www| 国产精品久久久一区麻豆最新章节 | 亚洲欧美国产精品桃花| 久久狠狠亚洲综合| 韩日午夜在线资源一区二区| 欧美国产第一页| 日韩视频一区| 国产精品嫩草影院一区二区| 西西人体一区二区| 欧美bbbxxxxx| 亚洲视频1区2区| 国内综合精品午夜久久资源| 久久综合综合久久综合| 亚洲日本免费| 欧美一区二区| 亚洲精品123区| 国产精品高清网站| 久久国产主播| 日韩视频二区| 久久久久久噜噜噜久久久精品| 在线国产欧美| 国产精品二区二区三区| 久久三级福利| 亚洲每日更新| 日韩小视频在线观看| 欧美日韩国产区| 欧美一区二区私人影院日本| 亚洲国产欧美另类丝袜| 性欧美8khd高清极品| 91久久一区二区| 国产视频在线观看一区二区| 欧美成人免费视频| 欧美影院成年免费版| 亚洲精品一品区二品区三品区| 久久午夜色播影院免费高清| 亚洲综合国产| 99国产一区| 亚洲福利视频二区| 国产欧美一区二区在线观看| 欧美日本乱大交xxxxx| 久久精品国产亚洲精品| 亚洲天天影视| 一区二区三区欧美亚洲| 亚洲国产精品一区二区第一页 | 欧美激情一区二区三区高清视频| 欧美在线播放一区| 亚洲一区国产| 在线一区二区三区四区|