好了,这是这类型设计模式的最后一个,最后一小节进行大总结。
1. 情景与意图
其实看到这个名字,也能对这个设计模式有了一个初步的印象,在我们日常生活中,通常有租房,买房,卖房的需求,这个过程比较漫长和消耗时间,因此我们通常会交给中介去处理,我们不用面对很多人,只用和中介通信即可。
在我们的工程中,也会存在对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。因此我们需要有一个中介者来担任中间者,负责相关通信,此时中介者模式就出现了。
2. 中介者模式
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
我们知道有一个架构模式叫MVC模式,其实MVC在小范围内也可以理解为中介者模式。下面我们来用MVC的方式实现中介者模式。
3. MVC
MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。这种模式用于应用程序的分层开发。
- Model(模型) - 模型代表一个存取数据的对象或 JAVA POJO。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
首先我们先建立一个model。表示数据模型。
typedef int DPModelInt;
struct DPAbstractModel{
};
struct DPUserModel :public DPAbstractModel{
std::string _userName;
DPModelInt _age;
std::string _userIdentify;
};
然后我们封装一个视图,这个视图是我们自定义的。这里加一些注释,针对没有过应用程序开发的同学。
struct DPCommonButton;
typedef void (*DPCommonButtonClick)(const DPCommonButton& button);
typedef void (*DPViewEditCallBack)(std::string userName, int userAge);
struct DPCommonButton {
std::string _title; // 按钮上的文字
DPCommonButtonClick _buttonClickAction; // 按钮的点击事件
};
struct DPCommonLabel {
std::string _text; // 标签上的文字
};
class DPView {
// 基础的一个用于显示的视图
};
class DPViewDelegate {
public:
// 运用代理模式,表示编辑后的回调
virtual void DPViewEditCallBack(std::string userName, int userAge) = 0;
};
class DPUserMessageEditView : public DPView{
// 在这个视图有编辑按钮,显示名字,显示年龄的标签。
DPCommonButton* _editButton;
DPCommonLabel* _userNameLabel;
DPCommonLabel* _userAgeLabel;
void buttonClick(const DPCommonButton& button);
public:
DPViewDelegate* _delegate;
DPUserMessageEditView(DPViewDelegate* delegate, std::string userName, std::string userAge);
//DPViewEditCallBack _viewEditkAction;
void display();
};
下面就是担当中介者的controller
class DPViewController : public DPViewDelegate{
DPUserModel* _userMessage; // 表示数据
DPUserMessageEditView* _view; // 显示的视图
public:
void DPViewEditCallBack(std::string userName, int userAge);
DPViewController();
void viewDidAppear();
};
DPViewController::DPViewController() {
_userMessage = new DPUserModel();
_userMessage->_userName = "Tom";
_userMessage->_age = 10;
_userMessage->_userIdentify = "123456789";
// 通过model来创建视图上的信息
_view = new DPUserMessageEditView(this, _userMessage->_userName, std::to_string(_userMessage->_age));
}
// 将视图编辑后的信息更新到model
void DPViewController::DPViewEditCallBack(std::string userName, int userAge) {
_userMessage->_userName = userName;
_userMessage->_age = userAge;
// 这里更新完后,可以再刷新view。
}
void DPViewController::viewDidAppear() {
_view->display();
}
假设我们现在要创建这样一个交互的程序。
int main() {
DPViewController ctl;
ctl.viewDidAppear();
return 0;
}
在这个例子中,controller就是一个中介者,是view与model沟通的桥梁。
4. 大总结
一样的,如果没有观看过前面的文章,欢迎阅读。
【门面模式】
【代理模式】
【适配器模式】
上面三篇文章 + 本片博文介绍的设计模式都属于同一个类型的设计模式,就是’接口隔离’。由于某些接口之间直接依赖会带来很多问题,或者无法直接依赖,这个时候我们会通常添加一层中间层来实现,来隔离相互密切关联的接口来降低耦合。
C++实现中介者模式源码:【中介者模式C++源码】