设计模式新说 - 通知模式(原观察者模式)

从婚礼通知说起

此处应有一张图片,新娘和新郎拿着手机凑在一起商量,该邀请哪些人来参加婚礼呢?

重点放在婚礼通知这个动作上,那么如何用代码来简单描述这个『通知』呢?


// 1. 首先得有一对新婚夫妇

NewlyMarriedCouple couple;



// 2. 有若干亲朋好友,这些人都有attend2Wedding()方法,新婚夫妇调用这个方法,他们就会来参加婚礼

People xiaofu;

People xiaoqi;

People xiaodi;

...



// 3. 结婚前,亲朋好友告诉这对新婚夫妇,结婚的时候一定要通知他们哦。于是新婚夫妇把这些人加进通知名单里面,等他们结婚了再调用他们参加婚礼的方法,让他们过来

couple.add2List(xiaodi);

couple.add2List(xiaoqi);

couple.add2List(xiaofu);

...



// 4. 这对新婚夫妇举办婚礼了,于是通知名单里面的所有人来参加婚礼

couple.notify();



// 通知呢就是遍历名单里面的所有人,调用他们预留的参加婚礼的方法

public void notify() {

    for (People guest: namelist) {

        guest.attend2Wedding();

    }

}

回味下婚礼通知中的两个重点过程:

  1. 亲朋好友要求这对新婚夫妇将自己添加进通知名单里面,这样新婚夫妇结婚的时候就可以通知他们来参加婚礼;

  2. 新婚夫妇办婚礼了,于是通知大家来参加,通知就是遍历名单,逐个邀请他们过来。

抽象一下:

  1. 亲朋好友将自己注册进新婚夫妇的通知名单里;

  2. 新婚夫妇遍历名单,调用每个人参加婚礼的方法,完成通知;

再抽象一下:

  1. 注册;

  2. 通知;

至此,我们就完成了『通知模式』的描述(纳尼,不是观察者模式吗?不着急啊)。

通知模式还有以下两个关键性问题:

  1. 注册到哪里?通知人有个名单(基础特征就是有这样一个list);

  2. 什么时候通知?通知人某个状态改变(比如要办婚礼了)。

通知模式是站在通知者(新婚夫妇)的角度考虑,即通知者拥有一个list,list里面都是关心通知者的人,这些人都实现了相同的一个接口即具备了相同的某个能力,比如参加婚礼。当通知者状态改变(办婚礼了)就调用自己的通知方法,方法里遍历所有人并调用大家参加婚礼的方法以便通知大家参加婚礼。至此实现通知功能。

通知功能的实现,重点在:

  1. 被通知人都到自己的list里面来,而且都要实现同一个接口;

  2. 只要通知里面的时候,只需要遍历你们并调用同一个方法即可;

这个模式的亮点就在于,被通知的人都实现了同一个接口,拥有同一个方法。这就存在了,大家把自己注册进通知者list,通知者一个遍历list就实现通知功能的可能。否则,如果每个被通知人的调用方法都不一样,那么就需要分别调用。这也就是接口存在的强大意义,两个字,规范。

我们回到没有接口需要分别调用的时代,这个时候,即每个人都需要分别通知

那么每个人都是关心新婚夫妇的人,类似于不断观察新婚夫妇的人,所以称之为观察者。

今天,接口已经存在了,。而且明明就是异步的通知,并不是同步的观察,所以为什么还用所以为什么还用观察者模式来称呼呢。

所以本文称之为通知模式。

修订

2016/02/15 23:50 初稿

你可能感兴趣的:(设计模式新说 - 通知模式(原观察者模式))