`
mmdev
  • 浏览: 12918021 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

浅学设计模式之观察者<Observer>模式及在android中的应用

 
阅读更多

最近在学习下设计模式,而加深学习的不错的方法就是把心得写出来吧。记录下自己的理解。现在自己看的书是《head.Frist设计模式》这本书。比较不错,想看的朋友可以看下。

观察者<Observer>模式(有时又被称为发布-订阅<Publish/Subscribe>模式、模型-视图<Model/View>模式、源-收听者<Source/Listener>模式或从属者<Dependents>模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。(源自百度百科)

(五月三十一号修正内容)

看下结构图:


开始一个小例子

Observer接口:


实现Observer接口的观察者:

个人订阅者:


企业订阅者:


被观察者:Subject


这里使用的是抽象类

下面是实现:


测试:


测试结果:




下面是有些错误五月18号版本:后面有错误解析!

举个例子,张三从邮局订阅了《南方周末》,李四从邮局订阅了《新京报》,王五从邮局里面订阅了《南方都市报》。当报纸抵达邮局的时候,邮局就会把报纸送递订阅者。而不需要订阅者天天到邮局询问报纸是否到达邮局。

下面开始代码:首先应该是个订阅者接口:


第三个方法非必须,前两个方法必须要有。(应修改为前两个非必须,第三个方法必须有)

然后有三个订阅者类:

张三:


李四:


王五:

三个订阅者,都有方法订阅报纸,或者取消订阅。其实关于订阅者的信息,是存储在邮局类里面。


邮局类:(邮局类应该继承一个抽象类或者接口(Subject),这里没有实现)

在这个类里面,有变化通知是使用的sendNewsPaper()这个方法,遍历所有的订阅者。
测试类:


打印结果:


这里只是提供了一个简单的例子,而且代码你会发现有冗余,三个订阅者类,几乎是一样,因为没有在类里面添加他们独自的属性,可以用一个Person类来替代。这里写这三个类是为了显示清晰。

关于五月18号的例子,观察者没必要有注册和取消注册的方法。他们的方法的实现也是调用的被观察者的注册和取消注册,不如直接使用被观察者的方法。

在Android中,button.setOnclickListener()这个方式是比较常见的观察者模式:当然,众所周知,onClick是著名的回调方法,在这里不会研究回调,不用太在意。

看下代码:


先button.setOnclickListener()进行注册。相当于邮局中的lisi.registered(mPostOffice),此处错误,应该是第一例中的postOffice.registered(person)。onclick响应事件相当于邮局中的


这个中的subscribe.getNewsPaper()这个方法。View.onClickListener相当于邮局。View也就是button是我们的订阅者,也就相当于张三。我们也可以在getNewsPaper中加一些自己的switch判断。

最后,如果我们的邮局要实现类似button这样的回调这么实现呢?


在这里,弄的有点绕,其实可以另起一个接口。不知道是否能够明白,不明白欢迎留言探讨。谢谢,今天就到此,周末愉快!


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics