HeadFirst设计模式_读书笔记_002_观察者模式
2017-04-11 10:23
316 查看
1.实际问题 还是拿传统的订报纸业务举例吧。虽然现在看报纸的人越来越少了。现在要我们给报社做一个用,只要用户订阅了报纸,一旦有新的报纸出来了就要送给客户。用户退订了就不用送了。 老师叫我们面向对象编程,那么这个问题的对象有哪些呢? 报社:新的报纸可以当作是它的一个状态,一旦报纸有更新,就要推给用户。 用户:用户是另外一个对象。并且很明显,它依赖报社报纸的更新。只有报社里面有新的报纸它才能收到。 这个问题还有什么特殊的地方吗?对了,报社只有一个,但是用户可能有多个。这是一个典型的一对多的关系。并且他们存在依赖,报社有新的报纸,用户应该及时收到,毕竟谁也不想花钱去看过时的旧闻吧。而且用户可以随时预定,也可以随时退订。说得高端一点,就是动态改变这种依赖关系。
![](http://dl2.iteye.com/upload/attachment/0123/5681/b881bf89-c6bf-3ca5-9915-6c622c43bd82.png)
这个时候再引出我们的另一个设计原则,就是当年老师提了很多遍的 “高内聚,低耦合”。很显然,这两个对象之间存在千丝万缕,剪不断理还乱的依赖关系。怎么设计才能低耦合呢? 2.什么是观察者模式 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都可以收到通知自动更新。 这么文邹邹的理论,看着就头疼,那还是回到我们上面将的问题。报社和客户,一家报社,多个用户,一对多吧。那谁依赖谁呢?一个用户订不订,报社都在那里开着,大不了不赚钱嘛。哈哈~~报社有新报纸,用户才有得看啊,总不能报社没出,用户先收到了报纸吧。所以这个依赖关系一定要搞明白。在这个模式里面,是多的一边依赖一的那一边。 那所谓观察者模式,谁是观察者呢?在我们的例子当中,用户,我们这些广大八卦的市民是观察者。主题也可以说是被观察者就是报社啦。 记住了,以后想到观察者模式,脑海里一定要浮现五个字:“一对多依赖”。然后就是,多的那一边是所谓的观察者。 3.代码实现
![](http://dl2.iteye.com/upload/attachment/0123/5699/fb3af2e7-99bb-33db-8dbe-5dd439003882.png)
![](http://dl2.iteye.com/upload/attachment/0123/5701/b31c0834-103c-38f0-af7f-7c529d9950b8.png)
![](http://dl2.iteye.com/upload/attachment/0123/5703/78103e63-5cc1-3cb8-932f-ee95140379c3.png)
4.测试应用 上面贴出来的代码已经实现了一个简单的观察者模式了,下面来看测试代码。
![](http://dl2.iteye.com/upload/attachment/0123/5709/f992afcf-7d02-34d8-989f-dda50d70444e.png)
测试结果:
![](http://dl2.iteye.com/upload/attachment/0123/5707/7baf26f4-6911-3ca6-aa1a-9aa68bbc547d.png)
反思: 是不是很神奇,其实用两个接口我们的问题就已经解决了。subject.setData() 一个方法就完成了我们想破头也没解决的问题。面向接口编程,Java的多态性是多么的伟大而重要啊。
![](http://dl2.iteye.com/upload/attachment/0123/5681/b881bf89-c6bf-3ca5-9915-6c622c43bd82-thumb.png)
大小: 7.4 KB
![](http://dl2.iteye.com/upload/attachment/0123/5699/fb3af2e7-99bb-33db-8dbe-5dd439003882-thumb.png)
大小: 20.3 KB
![](http://dl2.iteye.com/upload/attachment/0123/5701/b31c0834-103c-38f0-af7f-7c529d9950b8-thumb.png)
大小: 7 KB
![](http://dl2.iteye.com/upload/attachment/0123/5703/78103e63-5cc1-3cb8-932f-ee95140379c3-thumb.png)
大小: 20.1 KB
![](http://dl2.iteye.com/upload/attachment/0123/5707/7baf26f4-6911-3ca6-aa1a-9aa68bbc547d-thumb.png)
大小: 6.5 KB
![](http://dl2.iteye.com/upload/attachment/0123/5709/f992afcf-7d02-34d8-989f-dda50d70444e-thumb.png)
大小: 13.7 KB
查看图片附件
![](http://dl2.iteye.com/upload/attachment/0123/5681/b881bf89-c6bf-3ca5-9915-6c622c43bd82.png)
这个时候再引出我们的另一个设计原则,就是当年老师提了很多遍的 “高内聚,低耦合”。很显然,这两个对象之间存在千丝万缕,剪不断理还乱的依赖关系。怎么设计才能低耦合呢? 2.什么是观察者模式 观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都可以收到通知自动更新。 这么文邹邹的理论,看着就头疼,那还是回到我们上面将的问题。报社和客户,一家报社,多个用户,一对多吧。那谁依赖谁呢?一个用户订不订,报社都在那里开着,大不了不赚钱嘛。哈哈~~报社有新报纸,用户才有得看啊,总不能报社没出,用户先收到了报纸吧。所以这个依赖关系一定要搞明白。在这个模式里面,是多的一边依赖一的那一边。 那所谓观察者模式,谁是观察者呢?在我们的例子当中,用户,我们这些广大八卦的市民是观察者。主题也可以说是被观察者就是报社啦。 记住了,以后想到观察者模式,脑海里一定要浮现五个字:“一对多依赖”。然后就是,多的那一边是所谓的观察者。 3.代码实现
![](http://dl2.iteye.com/upload/attachment/0123/5699/fb3af2e7-99bb-33db-8dbe-5dd439003882.png)
![](http://dl2.iteye.com/upload/attachment/0123/5701/b31c0834-103c-38f0-af7f-7c529d9950b8.png)
![](http://dl2.iteye.com/upload/attachment/0123/5703/78103e63-5cc1-3cb8-932f-ee95140379c3.png)
4.测试应用 上面贴出来的代码已经实现了一个简单的观察者模式了,下面来看测试代码。
![](http://dl2.iteye.com/upload/attachment/0123/5709/f992afcf-7d02-34d8-989f-dda50d70444e.png)
测试结果:
![](http://dl2.iteye.com/upload/attachment/0123/5707/7baf26f4-6911-3ca6-aa1a-9aa68bbc547d.png)
反思: 是不是很神奇,其实用两个接口我们的问题就已经解决了。subject.setData() 一个方法就完成了我们想破头也没解决的问题。面向接口编程,Java的多态性是多么的伟大而重要啊。
![](http://dl2.iteye.com/upload/attachment/0123/5681/b881bf89-c6bf-3ca5-9915-6c622c43bd82-thumb.png)
大小: 7.4 KB
![](http://dl2.iteye.com/upload/attachment/0123/5699/fb3af2e7-99bb-33db-8dbe-5dd439003882-thumb.png)
大小: 20.3 KB
![](http://dl2.iteye.com/upload/attachment/0123/5701/b31c0834-103c-38f0-af7f-7c529d9950b8-thumb.png)
大小: 7 KB
![](http://dl2.iteye.com/upload/attachment/0123/5703/78103e63-5cc1-3cb8-932f-ee95140379c3-thumb.png)
大小: 20.1 KB
![](http://dl2.iteye.com/upload/attachment/0123/5707/7baf26f4-6911-3ca6-aa1a-9aa68bbc547d-thumb.png)
大小: 6.5 KB
![](http://dl2.iteye.com/upload/attachment/0123/5709/f992afcf-7d02-34d8-989f-dda50d70444e-thumb.png)
大小: 13.7 KB
查看图片附件
相关文章推荐
- 《HeadFirst设计模式》读书笔记-第2章-观察者模式
- Observer 观察者模式 (HeadFirst设计模式 c#)
- 《深入浅出设计模式-中文版》读书笔记-观察者模式(四)
- 设计模式读书笔记-----观察者模式
- head first 读书笔记:观察者模式(openfire 消息通知 demo)
- 【读书笔记】读《JavaScript设计模式》之观察者模式
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---观察者模式之WeatherReport
- 《Head First Design Patterns》读书笔记之观察者模式
- 《大话设计模式》读书笔记:建造者模式与观察者模式
- 《Head First设计模式》 读书笔记02 观察者模式 Observer
- 【C++实现】HeadFirst设计模式之观察者模式
- 【读书笔记】观察者模式第一版C#_C++
- 读书笔记12:观察者模式
- 读书笔记12:观察者模式
- 对象主题设计模式读书笔记-----观察者模式
- 设计模式读书笔记之观察者模式(Observer)
- 读书笔记12:观察者模式
- 【读书笔记】HeadFirst设计模式——单件不简单:详述实现Singleton模式需要考虑的方方面面
- 读书笔记2:Head First设计模式——观察者模式
- 读书笔记之 - javascript 设计模式 - 观察者模式