意图
用中介者对象封装一系列对象的交互,从而降低其他对象的耦合度,提高其他对象的复合性
结构图
使用场景
- 一组对象相互之间有复杂的通信方式
- 一个对象与其他的很多对象进行关联并且直接进行相互之间的通信
- 一个行为的实现需要其它多个类型的多个对象共同完成,但有不愿生成过多的子类
优点
- 减少子类生成,控制集体化。将对象之间的控制都集中在中介者对象中,只需派生中介者类就可以改变通信方式
- 将除了中介者对象之外的对象都解耦了
缺点
- 牺牲中介者类来提高其他类的复用性
实现
- 中介者模式的退化:如果中介者类以后不会发生变化,只有一个中介者类与替他类进行交互时,不需要抽象的中介者类。
- 中介者模式可以和其他模式一起使用比如:观察者模式
代码:
//
// 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);
}
*/