【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号_第1页
【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号_第2页
【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号_第3页
【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号_第4页
【移动应用开发技术】使用Java设计模式中的观察者模式如何开发微信公众号_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】使用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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论