意圖
用中介者對象封裝一系列對象的交互,從而降低其他對象的耦合度,提高其他對象的複合性
結構圖
使用場景
- 一組對象相互之間有複雜的通信方式
- 一個對象與其他的很多對象進行關聯並且直接進行相互之間的通信
- 一個行爲的實現需要其它多個類型的多個對象共同完成,但有不願生成過多的子類
優點
- 減少子類生成,控制集體化。將對象之間的控制都集中在中介者對象中,只需派生中介者類就可以改變通信方式
- 將除了中介者對象之外的對象都解耦了
缺點
- 犧牲中介者類來提高其他類的複用性
實現
- 中介者模式的退化:如果中介者類以後不會發生變化,只有一箇中介者類與替他類進行交互時,不需要抽象的中介者類。
- 中介者模式可以和其他模式一起使用比如:觀察者模式
代碼:
//
// 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);
}
*/