C++实现中介者模式

好了,这是这类型设计模式的最后一个,最后一小节进行大总结。

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++源码】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值