定义
包装了一系列对象相互作用的方式,使得他们之间不必相互明显作用,松散耦合。将多对多的相互作用转化为一对多。
使用场景
当很多个对象之间的交互操作很多,并且每个对象的行为操作都依赖影响彼此,为了防止修改一个对象的行为导致很多对象被修改,可以使用中介者模式。把系统从网状结构变成了以中介者为中心的星形结构。
实现
我们电脑有光驱、cpu、显卡、声卡等等,这些需要主板链接起来,主板就是一个中介者。
光驱读取数据然后需要cpu去解码,cpu解码后又会把解码的声音数据传递给声卡,视频数据传递给显卡。
我们先来创建抽象中介者类Mediator,里面有setCpu,setCDDevice等方法可以把组件对象设置进来,
各个组件对象的构造函数里面需要传入我们创建的中介者类,这样他们互相持有为成员变量引用。
中介者类里面有一个change(Colleague)方法,Colleague是我们具体的电脑各个组件类,方法里面根据传入的Colleague子类型(cpu还是显卡、还是声卡、CD)来去执行相对应对象具体的方法。
比如cd播放流程:
1.调用cd的load方法,方法里面读取数据流为data然后滴啊用mediator.change(this);
2.mediator的change方法判断传入的对象为cd然后执行自己的handler((CDDevice)c)方法,方法让cpu去解码 cpu.decodeData(cdDevice.read);
3.同理CPU类decodeData方法里面进行音频视频解码保存数据,然后调用mediator.change(this);
4.这时根据传入对象为cpu,就去执行自己的handler((CPU)c)方法,方法里面让显卡和声卡去播放soundCard.coundPlay(cpu.getDataSound()); graphicsCard.videoPlay(cpu.getDataVideo());
Android源码中的中介者模式
KeyGuard锁屏功能,KeyGuardViewMediator中有很多XXXManager管理器的成员变量.
实战
比如我们一个登录页面有文本输入框(用户名、密码),checkbox(记住账户、自动登录等),确认、取消按钮等等,当文本数据框状态改变会导致别的元素产生相应的变化,这时候就可以使用中介者模式了,我们这里使用Activity为中介者类,当每个元素状态改变时候,调用activity的change()方法,change()方法里面根据文本输入框是否有文字来改变所有元素的状态。
总结:
如果类很多依赖关系网错综复杂,就可以考虑使用中介者来解耦。
如果之间依赖关系不是很复杂就不要用中介者,否者会让逻辑结构变得复杂。