目录
Observer(观察者,Behavioral Pattern)
问题:看孩子
- 孩子哭了,爸爸要立刻检查孩子并安慰他
- 我们可以给爸爸单独开一个线程看着孩子
- 但是这个是一个一直进行的循环,很占用CPU
- 试了一下,真挺猛的,中间突然高的那一段就是程序运行的时候
- 如果我还想要妈妈也看着,也很简单,只要把爸爸代码复制一遍改个名字
- 然后再运行
- 如果有三个孩子,根据我们的设计,一个爹/妈只能看一个娃,所以会有三个人来看这三个娃,CPU会受不了的
- 我们要想办法!
- 平常我们看孩子不可能一直在看,都是要听到孩子哭才去看,所以这里的想法就是不要爸爸去一直观察,而是等着娃哭,再去观察
- 而且我们的Observer还不够nb,如果不用一直观察的话,那我一个爹就可以管一堆娃了,同理,一个娃也可以有一堆观察者
- 这就引出了我们的观察者模式
Observer Pattern
它是啥
- 根据我们上面的例子,针对这种情境,我们首先要有被观察的对象,我们称之为Subject,Subjects会改变状态,孩子可以哭或者高兴,商品价格可以升或降,你喜欢的姑娘可以有男朋友或者单身
- 我们还要有观察者Observer,比如看孩子的爸爸妈妈,看商品价格的剁手党,看姑娘是否单身的你
- 从看孩子过程中的问题我们可以发现,Observer应当是可以观察多个对象,同样一个Subject也被多个Observer观察
- 爹妈一起看一个孩子,爹一个人也能看一堆孩子
- 商品可以被一堆人等着降价,你也可以等着一堆漂亮衣服降价
- 一堆人等着漂亮姑娘单身,你也可以等着一堆漂亮姑娘单身
- 还有一个小问题,Observer不能一直看着Subject啊,生活中是浪费精力,计算机中是浪费内存
- 我们完全可以让Subject在改变状态时自己通知Observers