设计模式(二十二)——一文搞懂中介者模式与观察者模式区别

上一篇:设计模式(二十一)——访问者模式

下一篇:设计模式(二十三)——状态模式与策略模式的区别

中介者模式和观察者模式区别

先写结论:在单纯的类图、模式结构上没有本质区别,区别是在项目开发中根据业务需求而造成的区别

明细:两种模式都是行为型设计模式,中介者模式核心类是Mediator,参与者类是Colleage类,观察者模式核心类是Subject,参与者类是Observer。

1、类图、类的结构组成相同:中介者模式  Mediator中注入Colleage类型的list,提供一个change()方法,Colleage类中注入Mediator引用,提供opearate()和update()方法

观察者模式 Subject注入Observer类型的list,提供一个notify()方法,Observer类中注入Subject引用,提供operate()和update()方法

从类图来看,注入包括类中属性注入和方法中形参注入,两种方式没有本质区别,只要可以完成业务逻辑即可,所以其类图类的结构没有本质区别

2、函数调用基本架构相同:中介者模式  colleage.operate() ==> mediator.change() ==> list中所有colleage.update()

观察者模式  observer.opearate() ==> subject.notify() ==> list中所有observer.update()

从函数调用基本架构来看,都是客户端直接调用参与者类的operate(),间接调用其他参与者类的update(),没有本质区别

3、业务逻辑意义不同:一般来说,中介者模式的各个参与类都是不同类对象,像另一文的Button Label ComboBox PictureBox,扩展的的时候要新建参与者类;而观察者类参与类是一个类的不同对象,像另一文的Player类,扩展的时候不用新建参与类,只要在客户端新建一个对象就好了

4、业务逻辑——单向与双向不同:一般来说,中介者模式中,基本上都是双向的,每一个Colleage参与类都可以operate()间接调用其他Colleage参与类的update()方法,也可以被其他Colleage类的operate()间接调用,任何时候都是双向的,各个参与者之间是绝对平级的,没有任何上下级关系;

观察者模式中,可以是双向的(你可以观察我的变化,我也可以观察你的变化),也可以是单向的(我可以观察你的变化,你也可以观察我的变化,但是在业务逻辑上你观察我没有意义)(比如老师上课,老师与学生,老师Observer的变化通过Subject被学生Observer观察,但是学生的变化没有必要给老师观察;比如交警指挥,交警与司机,交警Observer的变化通过Subject被司机Observer观察,但是司机的变化没有必要给交警观察);

即:在观察者模式一些情况下,代码上完全可以实现双向观察,但逻辑上没有意义,从而造成了观察者模式中参与者Observer之间特殊与一般的关系.

5、侧重点不同:

观察者模式:不用关心这个列表里有谁,只用关心想让谁加入让谁退出;

中介者模式:用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互。

观察者模式一般提供join()和quit()方法,关心谁加入谁退出,中介者模式一般提供join()就好,也可以提供quit() 。

 

中介者模式:

https://blog.csdn.net/qq_36963950/article/details/102846157

观察者模式:

https://blog.csdn.net/qq_36963950/article/details/102866233
 

上一篇:设计模式(二十一)——访问者模式

下一篇:设计模式(二十三)——状态模式与策略模式的区别

你可能感兴趣的:(6.设计模式)