版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号
这篇文章将为大家详细讲解有关使用Java设计模式中的观察者模式如何开发微信公众号,在下觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。用Java设计模式中的观察者模式开发微信公众号的例子观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在这里先讲一下面向对象设计的一个重要原则——单一职责原则。因此系统的每个对象应该将重点放在问题域中的离散抽象上。因此理想的情况下,一个对象只做一件事情。这样在开发中也就带来了诸多的好处:提供了重用性和维护性,也是进行重构的良好的基础。因此几乎所有的设计模式都是基于这个基本的设计原则来的。观察者模式的起源我觉得应该是在GUI和业务数据的处理上,因为现在绝大多数讲解观察者模式的例子都是这一题材。但是观察者模式的应用决不仅限于此一方面。好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。看一张图:其中每个使用者都有上图中的3条线,为了使图片清晰省略了。如上图所示,服务号就是我们的主题,使用者就是观察者。现在我们明确下功能:1、服务号就是主题,业务就是推送消息2、观察者只需要订阅主题,只要有新的消息就会送来3、当不想要此主题消息时,取消订阅4、只要服务号还在,就会一直有人订阅好了,现在我们来看看观察者模式的类图:接下来就是代码时间了,我们模拟一个微信3D彩票服务号,和一些订阅者。首先开始写我们的主题接口,和观察者接口:package
com.zhy.pattern.observer;
/**
*
主题接口,所有的主题必须实现此接口
*
*
@author
zhy
*
*/
public
interface
Subject
{
/**
*
注册一个观察着
*
*
@param
observer
*/
public
void
registerObserver(Observer
observer);
/**
*
移除一个观察者
*
*
@param
observer
*/
public
void
removeObserver(Observer
observer);
/**
*
通知所有的观察着
*/
public
void
notifyObservers();
}
package
com.zhy.pattern.observer;
/**
*
@author
zhy
所有的观察者需要实现此接口
*/
public
interface
Observer
{
public
void
update(String
msg);
}接下来3D服务号的实现类:package
com.zhy.pattern.observer;
import
java.util.ArrayList;
import
java.util.List;
public
class
ObjectFor3D
implements
Subject
{
private
List<Observer>
observers
=
new
ArrayList<Observer>();
/**
*
3D彩票的号码
*/
private
String
msg;
@Override
public
void
registerObserver(Observer
observer)
{
observers.add(observer);
}
@Override
public
void
removeObserver(Observer
observer)
{
int
index
=
observers.indexOf(observer);
if
(index
>=
0)
{
observers.remove(index);
}
}
@Override
public
void
notifyObservers()
{
for
(Observer
observer
:
observers)
{
observer.update(msg);
}
}
/**
*
主题更新消息
*
*
@param
msg
*/
public
void
setMsg(String
msg)
{
this.msg
=
msg;
notifyObservers();
}
}模拟两个使用者:package
com.zhy.pattern.observer;
public
class
Observer1
implements
Observer
{
private
Subject
subject;
public
Observer1(Subject
subject)
{
this.subject
=
subject;
subject.registerObserver(this);
}
@Override
public
void
update(String
msg)
{
System.out.println("observer1
得到
3D
号码
-->"
+
msg
+
",
我要记下来。");
}
}package
com.zhy.pattern.observer;
public
class
Observer2
implements
Observer
{
private
Subject
subject
;
public
Observer2(Subject
subject)
{
this.subject
=
subject
;
subject.registerObserver(this);
}
@Override
public
void
update(String
msg)
{
System.out.println("observer2
得到
3D
号码
-->"
+
msg
+
"我要告诉舍友们。");
}
}可以看出:服务号中维护了所有向它订阅消息的使用者,当服务号有新消息时,通知所有的使用者。整个架构是一种松耦合,主题的实现不依赖与使用者,当增加新的使用者时,主题的代码不需要改变;使用者如何处理得到的数据与主题无关;最后看下测试代码:package
com.zhy.pattern.observer.test;
import
com.zhy.pattern.observer.ObjectFor3D;
import
com.zhy.pattern.observer.Observer;
import
com.zhy.pattern.observer.Observer1;
import
com.zhy.pattern.observer.Observer2;
import
com.zhy.pattern.observer.Subject;
public
class
Test
{
public
static
void
main(String[]
args)
{
//模拟一个3D的服务号
ObjectFor3D
subjectFor3d
=
new
ObjectFor3D();
//客户1
Observer
observer1
=
new
Observer1(subjectFor3d);
Observer
observer2
=
new
Observer2(subjectFor3d);
subjectFor3d.setMsg("20140420的3D号码是:127"
);
subjectFor3d.setMsg("20140421的3D号码是:333"
);
}
}输出结果:observer1
得到
3D
号码
-->20140420的3D号码是:127,
我要记下来。
observer2
得到
3D
号码
-->20140420的3D号码是:127我要告诉舍友们。
observer1
得到
3D
号码
-->20140421的3D号码是:333,
我要记下来。
observer2
得到
3D
号码
-->20140421的3D号码是:333我要告诉舍友们。对于JDK或者Andorid中都有很多地方实现了观察者模式,比如XXXView.addXXXListenter,当然了XXXView.setOnXXXListener不一定是观察者模式,因为观察者模式是一种一对多的关系,对于setXXXListener是1对1的关系,应该叫回调。恭喜你学会了观察者模式,上面的观察者模式使我们从无到有的写出,当然了java中已经帮我们实现了观察者模式,借助于java.util.Observable和java.util.Observer。下面我们使用Java内置的类实现观察者模式:首先是一个3D彩票服务号主题:package
com.zhy.pattern.observer.java;
import
java.util.Observable;
public
class
SubjectFor3d
extends
Observable
{
private
String
msg
;
public
String
getMsg()
{
return
msg;
}
/**
*
主题更新消息
*
*
@param
msg
*/
public
void
setMsg(String
msg)
{
this.msg
=
msg
;
setChanged();
notifyObservers();
}
}下面是一个双色球的服务号主题:package
com.zhy.pattern.observer.java;
import
java.util.Observable;
public
class
SubjectForSSQ
extends
Observable
{
private
String
msg
;
public
String
getMsg()
{
return
msg;
}
/**
*
主题更新消息
*
*
@param
msg
*/
public
void
setMsg(String
msg)
{
this.msg
=
msg
;
setChanged();
notifyObservers();
}
}最后是我们的使用者:package
com.zhy.pattern.observer.java;
import
java.util.Observable;
import
java.util.Observer;
public
class
Observer1
implements
Observer
{
public
void
registerSubject(Observable
observable)
{
observable.addObserver(this);
}
@Override
public
void
update(Observable
o,
Object
arg)
{
if
(o
instanceof
SubjectFor3d)
{
SubjectFor3d
subjectFor3d
=
(SubjectFor3d)
o;
System.out.println("subjectFor3d's
msg
--
>"
+
subjectFor3d.getMsg());
}
if
(o
instanceof
SubjectForSSQ)
{
SubjectForSSQ
subjectForSSQ
=
(SubjectForSSQ)
o;
System.out.println("subjectForSSQ's
msg
--
>"
+
subjectForSSQ.getMsg());
}
}
}看一个测试代码:package
com.zhy.pattern.observer.java;
public
class
Test
{
public
static
void
main(String[]
args)
{
SubjectFor3d
subjectFor3d
=
new
SubjectFor3d()
;
SubjectForSSQ
subjectForSSQ
=
new
SubjectForSSQ()
;
Observer1
observer1
=
new
Observer1();
observer1.registerSubject(subjectFor3d);
observer1.registerSubject(subjectForSSQ);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版音乐四年级下册第二单元《天山之春》教学设计
- 保险复议合同模板简易
- 上学期高一期初语文试题汇编:名篇名句默写
- 劳务竣工合同模板
- 农村无证土地合同模板
- 取消房屋转让合同模板
- 加工生产采购合同模板
- 乡村振兴规划编制合同模板
- 商铺委托转让合同协议书
- 商品灰销售合同模板
- 线性代数绪论
- 小学三年级学生数学过程性评价方案
- 销售技巧与销售技巧
- 小学人教四年级数学《沏茶问题》课件
- 海参养殖技术规范
- 智能分拣系统行业商业发展计划书
- 新概念英语青少版1A-Unit-7课件(共45张)
- 关于违规收受礼品礼金警示教育心得体会范文
- 机械制造课程设计-《机械制造工艺学》课程设计
- 2023秋高中化学选择性必修3 有机化学基础 综合测试(含答案)
- 施工动火方案模板
评论
0/150
提交评论