中介者模式

意圖

用中介者對象封裝一系列對象的交互,從而降低其他對象的耦合度,提高其他對象的複合性

結構圖

這裏寫圖片描述

使用場景

  1. 一組對象相互之間有複雜的通信方式
  2. 一個對象與其他的很多對象進行關聯並且直接進行相互之間的通信
  3. 一個行爲的實現需要其它多個類型的多個對象共同完成,但有不願生成過多的子類

優點

  1. 減少子類生成,控制集體化。將對象之間的控制都集中在中介者對象中,只需派生中介者類就可以改變通信方式
  2. 將除了中介者對象之外的對象都解耦了

缺點

  1. 犧牲中介者類來提高其他類的複用性

實現

  1. 中介者模式的退化:如果中介者類以後不會發生變化,只有一箇中介者類與替他類進行交互時,不需要抽象的中介者類。
  2. 中介者模式可以和其他模式一起使用比如:觀察者模式

代碼:

//
//  DialogDirector.h
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef DialogDirector_h
#define DialogDirector_h

#include <iostream>
#include <vector>
using namespace std;
class Widget;

/*抽象Mediator基類*/
class DialogDirector
{
public:
    virtual ~DialogDirector();

    virtual void showDialog(){}
    virtual void widgetChanged(Widget *) = 0;
    /*往中介者類中添加同事類*/
    void addWidget(Widget *widget);
protected:
    DialogDirector(){}
    vector<Widget* > component;
};
#endif /* DialogDirector_h */

//
//  DialogDirector.cpp
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "DialogDirector.h"
#include "Widget.h"

void DialogDirector::addWidget(Widget *widget)
{
    component.push_back(widget);
    widget->setDialogDirector(this);
}

DialogDirector::~DialogDirector()
{
    std::cout<<"sdgag";
    for(vector<Widget*>::iterator iter = component.begin(); iter != component.end(); ++iter){
        delete (*iter);
    }
}
//
//  Widget.h
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef Widget_h
#define Widget_h

#include <iostream>
#include "DialogDirector.h"

/*組件接口*/
class Widget
{
public:
    Widget(){}
    /*Widget(DialogDirector *dir){ this->director = dir; }
    組件通過此函數調用中介者函數進行通信的轉播*/
    virtual void changed(){ director->widgetChanged(this); }

    void setDialogDirector(DialogDirector *dia){
        director = dia;
    }
    virtual ~Widget(){}
private:
    DialogDirector* director;
};
#endif /* Widget_h */

//
//  Widget.cpp
//  textD
//
//  Created by md101 on 15/10/20.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "Widget.h"
//
//  ListBox.h
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef ListBox_h
#define ListBox_h

#include <iostream>
#include "Widget.h"

class ListBox:public Widget
{
public:
    ListBox(DialogDirector *dir);
    ListBox(){}
    ~ListBox(){ std::cout<<"ListBox析構"<<endl;}


};


#endif /* ListBox_h */

//
//  ListBox.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "ListBox.h"
//
//  EntryField.
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef EntryField_h
#define EntryField_h

#include <iostream>
#include "Widget.h"

class EntryField:public Widget
{
public:
    EntryField( DialogDirector *dir);
    EntryField(){}
    ~EntryField(){ std::cout<<"EntryField析構"<<endl;}
};
#endif /* EntryField_h */

//
//  EntryField.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "EntryField.h"
//
//  FontDialogDirector.h
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#ifndef FontDialogDirector_h
#define FontDialogDirector_h

#include <iostream>
#include "DialogDirector.h"
#include "ListBox.h"
#include "EntryField.h"


class FontDialogDirector:public DialogDirector
{
public:
    FontDialogDirector(){}
    virtual ~FontDialogDirector(){std::cout<<"sdfs";}
    /*通過傳入一個指針進行判斷從而實現各組件之間的協同工作,該函數中包含了具體的哪個對象同哪個對象的通信的細節*/
    virtual void widgetChanged(Widget *theWorkWidget);

protected:
    /*創建組件,中介者對象與同事對象實現相互綁定
    virtual void creatWidgets();*/

};

#endif /* FontDialogDirector_h */

//
//  FontDialogDirector.cpp
//  textD
//
//  Created by md101 on 15/10/21.
//  Copyright © 2015年 md101. All rights reserved.
//

#include "FontDialogDirector.h"
using namespace std;

void FontDialogDirector::widgetChanged(Widget *theWorkWidget)
{
    for(vector<Widget*>::iterator iter = component.begin(); iter != component.end(); ++iter){
        if (theWorkWidget == *iter) {
            cout<<"EntryField與其他的對象通信的細節"<<endl;
        }else if(theWorkWidget == *iter){
            cout<<"boxg與其他的對象通信的細節"<<endl;
        }
    }

}
/*
void FontDialogDirector::creatWidgets()
{
    field = new EntryField(this);
    box = new ListBox(this);
}
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章