博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity应用架构设计(2)——使用中介者模式解耦ViewModel之间通信
阅读量:6961 次
发布时间:2019-06-27

本文共 2288 字,大约阅读时间需要 7 分钟。

阅读目录

当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件)。越是复杂的页面,被切割出来的子模块就越多,子模块越多,彼此之间需要同步的数据和状态就越频繁,即易产生耦合。那么如何保证在复杂业务情况下,各个子模块之间可以随意通信并保持弱耦合关系,这正是本文所讨论的。

耦合的产生

试想一下,你有这样一下需求,点击 View A中的按钮,View B也需要做出相应的改变。

o_a2.png

这不是很简单吗。脑海里迅速出现两种解决方案:

1.View A 主动通知View B做出更新,也就是View A依赖 View B

void Notify(){    ViewB.Update(color);}

2.View B监听View A的ColorChanged事件,主动拉取数据并更新,即ViewB 依赖View A

ViewA.OnColorPropertyValueChanged+=(color)=>{    Update(color);**}

这两种实现毫无疑问是没问题的,至少从结果上来看是正确的。但试想一下,在一个复杂的客户端单页应用程序,这种紧耦合关系会导致程序的复杂度陡然上升。每个View/ViewModel依赖其余对象,而本身又被其他View/ViewModel强引用。这显然不是好的实践方式。

还记得我在上一篇文章的对于MVVM的描述吗?

MVVM的核心思想就是解耦,View与ViewModel应该感受不到彼此的存在。ViewModel与ViewModel之间也应该感受不到彼此的存在。

中介者模式的引入

那么如何消除这种紧耦合关系呢?交给中介者设计模式来解决吧。

我们需要添加一个中介者,每个ViewModel Publisher对象都会在自己状态改变时,告诉中介者。每个ViewModel Subscribers 都需要告诉中介者请求来时进行怎样的响应。

o_a3.jpg

在没有中介者之前对象之间都需要彼此认识,互相引用,是一种强耦合关系。有了中介者之后,彻底解耦。

那么现在就需要定义一个中介者,称为MessageAggregator。因为由它来转发消息,所以核心是一个字典,保存了所有需要被转发的消息。它的Key为消息的唯一Id,Value代表一个对该Message的处理程序。

public delegate void MessageHandler
(object sender, MessageArgs
args);public class MessageAggregator
{ private readonly Dictionary
> _messages = new Dictionary
>(); public static readonly MessageAggregator
Instance=new MessageAggregator
(); private MessageAggregator() { } public void Subscribe(string name, MessageHandler
handler) { if (!_messages.ContainsKey(name)) { _messages.Add(name, handler); } else { _messages[name] += handler; } } public void Publish(string name, object sender, MessageArgs
args) { if (_messages.ContainsKey(name) && _messages[name] != null) { //转发 _messages[name](sender, args); } }}

解耦ViewModel与ViewModel

通过中介者MessageAggregator对象,ViewModelB Subscribe一个对消息来时的处理函数:

MessageAggregator.Instance.Subscribe("ColorChanged",ToggleHandler);

ViewModel A在自己状态改变时,Pulish状态改变的消息给中介者:

MessageAggregator.Instance.Publish("ColorChanged", this,new MessageArgs("Red"));

o_ezgif-1-5a71513439.gif

小结

中介者模式常常用来协调相关的GUI组件,可以让对象之间传递的消息变得简单。但如果设计不当,中介者本身会变得过于复杂。

源代码托管在Github上,

本博客为 原创,基于 发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名 (包含链接)。如您有任何疑问或者授权方面的协商,请给我留言。
分类: ,
本文转自木宛城主博客园博客,原文链接:http://www.cnblogs.com/OceanEyes/p/using_message_aggregator_mediator_communication_between_viewmodels.html,如需转载请自行联系原作者
你可能感兴趣的文章
20181113-2 每周例行报告
查看>>
16.Python网络爬虫之Scrapy框架(CrawlSpider)
查看>>
开发人员linux命令总结
查看>>
递归求简单交错幂级数的部分和
查看>>
TYVJ 1016 装箱问题 by C++
查看>>
小组冲刺第九天
查看>>
JS原型和原型链
查看>>
全面理解Java内存模型
查看>>
小程序知识总结-分享
查看>>
HTML列表
查看>>
判断字符串a和b是否互为旋转词
查看>>
锁消除
查看>>
Android开发之炫酷MD风格
查看>>
eclipse生成spring boot jar包
查看>>
jetty java文件无法删除 java文件占用 delete无效 运行时锁定静态资源的解决方法...
查看>>
Centos7安装Python3.7
查看>>
Android 天气曲线
查看>>
机器学习入门04 - 使用TensorFlow的起始步骤 (First Steps with TensorFlow)
查看>>
纵向表和横向表
查看>>
EF 踩过的坑
查看>>