首页 >凉菜

来自观察者模式中两个成员的经典对话

2019-12-04 03:56:16 | 来源: 凉菜

一.引子:观察者模式中两个成员的对话

<<Head First Design Pattern>> 第二章中在讲到观察者模式的时候有段很经典的,是观察者模式中两个角色Subject跟Observer的对话,以下称Subject为S, Observer为O(不是完全按里面翻译的):

S:很高兴,为了改善咱两的关系,终于等到了今天这个机会跟Observer面对面地来交流。

O:哦,真的啊?我还以为您从来都没有太在意我们这些Observers啊。

S:呃,我一直都尽我所能做好我自己的工作啊,不是吗?每每在关键的时刻我都会告诉你们究竟是发生什么事了。。。我不认识你们中的每个人这样不意味着我是不在意你们的啊,而且对于你们来说,有一件最重要的事情我是知道的:你们都实现了Observer这样的接口,每当在关键时候,我告诉你们发生什么事了,你们就可以马上地去处理了。

O:嗯,确实是这样啊。但是那只是我们身上的一小部分啊,还有很多您是不知道的啊。无论怎样,我对您还是相当了解的。。。

S:哦,是吗?都了解哪些呢,不妨说来听听。

O:好的,比如说当您那边的情况一发生了什么变化,您始终都是把这些新“情报”第一时间地传达到我们中的每个Observer,这样我们就时刻都很清楚您那边是处于什么样的状态。但是有时这样也使我们感到很苦恼啊。。。

S:哦,对此我表示抱歉。我必须把我的状态送给我的通知器比如说notifyObservers()然后让它来通知你们,所以你们这些懒惰的Observers就知道发生了什么事了。

O:OK,等等,首先我们不是懒惰,因为您一旦通知我们事情有什么变化了,我们得在您Subject先生和您的通知器之间处理很多其它的事情啊;其次,为什么不让我们接近您呢,这样我们就可以很方便地拿到我们每个人真正所关心的那方面啊,而您总是把事情的方方面面都推到了我们每个人的面前,有些对我一点作用也没有。

S:嗯。。。我想那样会更起作用。跟你说这样的情况,你们Observers正在观察XX公司的一个具有一千多个字段的雇员信息,你们想让我在那些雇员们的某些属性发生变化后告诉你们,那你说在这种情况下我让你们进入我的个人世界,然后让你得到想要的,你们知道哪些属性发生变化吗,不可能的!也许是雇员的薪水变化了,也许是他们换了一个老板。这种情况下将可能是一件很危险的事情啊!所以说我不能让你们进来我的个人世界然后随你们探听察看我所拥有的一切。

O:那您为什么不留个公开的getter方法,从而我们就可以借助这个getter方法得到我们自己想要的那些啊?

S:是的,我确实可以让你们拉(pull)到我身上的状态。但是如果像你刚才所说的那样来做的话会更加方便吗?如果每次你都必须到进入我的个人世界然后拿走你们所想要的东西,这样的话你可能就得产生多个调用重复的getter方法来得所有你们想要的东西。这就是为什么我更喜欢把东西直接推(push)给你们的原因了。。。然后再个通知器里面你们就可以直接拿到所需的任何东西了。

O:不要做得这么的积极啊!在我们这些Observers中,各种各样的性格都有,你无法意料到我们需要的每件东西。就让我们进入您的个人世界,然后拿到我们所需要的东西。像这种方式的话,假如我们当中的某些Observers只是需要某些东西这样的话,这样的话我们就不会被迫接受给予的全部东西了。这样做也很方便以后地扩展啊。现在假设出现这种情况:由于各方面的原因,你壮大了自己,必须增加某种状态,如果是使用让我们自己拿(pull)的方式的话,您就不必为修改我们每个Observer的update方法,然后增加那个新来的东西这样的事情而到处奔波,您只需要在自己身上多写一个getter方法来支持这个新进来的状态就行了。

S:嗯,其实我能看出来无论是“推我”还是“拉你”都各有各的优点啊。我已经注意到了Java已经有了内置的对我们观察者模式的支持了,它可以允许你自己选择是要推我,还是拉你。

O:哦,真的?我想我要去感受下这种好处了。。。

S:嗯,好极了。。。我想我也要去看一个好的“拉你”的例子了,从而改变我的心态啊。。。

O:什么?我没听错吧,难道咱俩已经达到共识了?我想希望总是有的啊。。。

心房颤动影响心率吗
吃立可安能改善肠道感染吗
防动脉硬化症状能吃通心络吗
婴儿发烧手脚冰凉怎么回事

猜你喜欢