观察者模式
也是从一个小故事开始吧,寻求租房的A、B,有一栋楼的房东。 A希望租到小单间,B希望租到大House,他们同时电话联系房东,房东说你们联系电话都记住了,后面有房间就通知看房,这时候就是构建了观察者模式。
有一天,有个空房子了,房东立刻打联系A,B。
但是这样就带来了一个问题,A和B想租的是两种类型的房子,但是房东不知道他们说的对应到底是多大面积的,自己也懒得管,就直接说现场看满意就租。
// 值得注意的是,这里房东对象里面的租客表里存的其实是打某个租客电话的函数,而不是电话,这样设计代码更好实现。
房东:{
租客联系表:[],
新增租客:(通知)=> void
有空房子了:(房子信息)=> void
}
通知我A: ()=> void
通知我B: ()=> void
新增租客(通知我A)
新增租客(通知我B)
......
房东:{
租客联系表:[通知我A,通知我B]
新增租客:(通知)=> void
有空房子了:(房子信息)=> void
}
......
有房间了
有空房子了:(){
for (通知 in 租客联系表) 通知()
}
发布订阅模式
这个时候有个中介联系房东说,我来帮你出租房子,你只要给我说有房子空了就行。 然后变成了这样,房子被分成了小,中,大三种。还是A,B两个租房的,找到这个中介,A选了小,B选了大,中介也一样说有空房子就电话通知你们。中介在小下面登记了A的电话,大下面登记了B的电话。
有一天,房东有个空房间了给中介说,中介看了原来是个小的房子空了,查到准备租小的租客名单,挨个打电话通知。现在就是构建了发布订阅模式。
中介:{
租客联系表:{
小:[],
中:[],
大:[]
}
新增租客:(联系他, 类型)=> void
有空房子了:(类型)=>void
}
......
A要租小的,B要大的,C说要超级大
中介.新增(联系A,小)
中介.新增(联系B,大)
中介.新增(联系C,超级大)
租客联系表:{
小:[联系A: ()=>void],
中:[],
大:[联系B: ()=>void],
超级大:[联系C: ()=>void]
}
......
有空房子了!
有空房子了(小)找到小里面的联系方法循环调用
// 要点:虽然我们思维上是三个class,但是实际编程时,只有中介一个是固定对象,房东和租客都只需要function,是不是对象无所谓了。