最近在学习下设计模式,而加深学习的不错的方法就是把心得写出来吧。记录下自己的理解。现在自己看的书是《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这样的回调这么实现呢?
在这里,弄的有点绕,其实可以另起一个接口。不知道是否能够明白,不明白欢迎留言探讨。谢谢,今天就到此,周末愉快!
分享到:
相关推荐
android开发应用详解教程,是一本非常不错的电子教程,浅学易懂,适合初学上手学习!
浅学RC充放电电路
浅学电子幸运大转盘知识
此文粗略得介绍了pascal语言,学过初级编程的容易接受
二极管,三极管,PN接
1、XML AJAX: Asynchronous Javascript And Xml 1、什么是XML eXtensible Markup Language 可扩展的 标记 语言 XML的标记没有预定义过,需要自行定义 XML的宗旨是做数据传递的,而非... $xml.="<...>"; ....
(6)反思:其实这个系统非常非常的不完善,由于我数据库当时学的不太行,sqlite存储中文不太会搞,所以把那五本图书的信息直接存储在数组中了,每次打开调用一下,其实这是非常不友好的处理方式,如果图书的内容...
由于小编接触Vue比较多,React只是浅学,所以本篇主要针对Vue来展开介绍,带你一步一步搞懂它。 虚拟DOM 什么是虚拟DOM? 虚拟DOM(Virtual Dom),也就是我们常说的虚拟节点,是用JS对象来模拟真实DOM中的节点,...
1. 这个是git上朋友发的,我这就是蹭蹭人家流量了 2. 是一个时序预测的问题的数据集 3. 每个小时一个数据,每个batch训练的数据是前一周也就是196个小时,预测的结果是下一天的数据24小时
对字节序的一些理解。
一份相当不错的Java大学基础教程 课件中还附有源代码,浅学易懂。
这里就是通过布局文件中Button控件的属性值onClick=”click”实行回调函数click,代表着点击按钮有click方法响应。 回调函数代码如下,首先要通过id找到对应的按钮 myBtn_one.findViewById(R.id.btn_one); 要实现...
白话云计算 近年来,云计算技术广为热议,各种应用也不断涌现,并逐步改变着我们的生活、工 作方式,我国和英、美等发达国家一样,业已将云计算技术研发和应用上升为国家战略 ,新一轮技术革命的号角已然响起。...
非常好的教程,浅学易懂,主要是基于centos的讲解
基于Huffman编码思路的一个测试性压缩工具,但是由于个人水平原因(浅学的业余爱好者),并没有利用到Huffman编码的树状结构特点。另,由于快开学了......so,bug还没来得及修复,开学后有时间我会再打磨一下,另,...
C语言上机归类,这个是浅学C语言的好资料,不过对付计算机二级C的编程部分的考试也是错错有余的。
oclhashcat.zip
我的选课建议和升学经验 .pages