观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐、电子产品、Game、股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们。在代码中。我们也有这种一种方式来设计一些好玩的思想来。今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想。

好,程序猿是不善言语的,看代码先。

1.demo的结构:

2.先创建我们的主题类Subject,他就是我们本demo的明星类。继承了Observable,顾名思义,就是被观察的类 。其它观察者对他但是虎视眈眈哦(事实上包含你哦)

/**
* 定义一个主题类
* @author jan
*/
public class Subject extends Observable implements Parcelable {
private int id;
private String name;
private String message; public Subject(){} public Subject(Parcel parcel){
this.id = parcel.readInt();
this.name = parcel.readString();
this.message = parcel.readString();
} public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
notifyChanged();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
notifyChanged();
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
notifyChanged();
} /**
* 数据改变后。通知我们的订阅该主题的“观察者”数据已经更新
*/
private void notifyChanged(){
setChanged();
notifyObservers();
} @Override
public String toString() {
return "Subject [id=" + id + ", name=" + name + ", message=" + message
+ "]";
} @Override
public int describeContents() {
return 0;
} @Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(this.id);
dest.writeString(name);
dest.writeString(message);
} public static final Parcelable.Creator<Subject> CREATOR = new Creator<Subject>() { @Override
public Subject[] newArray(int size) {
return new Subject[size];
} @Override
public Subject createFromParcel(Parcel source) {
return new Subject(source);
}
};
}

3.嗯,以下就说说我们的观察者Bean先生吧,首先他必需要有个身份,不然怎么叫观察者,他要实现我们的Observer接口,和他的update方法:这是接收最新动态的入口哦!

/**
* 这是bean先生。一位订阅者对象
*/
public class ObserverBean implements Observer { private Handler hanlder; private Subject subjcet; public ObserverBean(Handler handler){
this.hanlder = handler;
} public Subject getSubjcet() {
return subjcet;
} public void setSubjcet(Subject subjcet) {
this.subjcet = subjcet;
} @Override
public void update(Observable observable, Object data) {
this.subjcet = (Subject) observable;
Log.i("ObserverBean", "主题已经更新:"+this.subjcet.toString());
if(hanlder!=null){
Message msg = hanlder.obtainMessage(2);
msg.obj = subjcet;
msg.sendToTarget();
}
}
}

4.我们的主界面来了,哈哈这个Activity 也是一名观察者哦。一名观察者怎么够,至少2个吧,废话少说,看代码。

/**
* 观察者模式的一种使用方式,在这里基本的功能是显示我们感兴趣的主题怎样改变并通知他们的订阅者,即观察者
* 本样例的效果不是重点,主要是添加对Observer的了解。
* @author jan
* Date:2015年7月22日 20:27:01
*/
public class ObserverActivity extends Activity implements Observer {
private static final String TAG = "ObserverActivity";
// 显示改变的主题内容
private TextView mSubText1;
private TextView mSubText2;
// 被订阅的主题
private Subject mSubject;
private UpdateRunnable runnable;
// 观察者实体类,我们还有一个订阅对象
private ObserverBean bean; private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if (msg.what == 1) { // 更新ObserverActivity的收到的主题
Subject sj1 = (Subject) msg.obj;
mSubText1.setText(sj1.getId() + "\n" + sj1.getName() + "\n"
+ sj1.getMessage());
return true;
} else if (msg.what == 2) { // 更新bean先生收到的主题内容
Subject sj2 = (Subject) msg.obj;
mSubText2.setText(sj2.getId() + "\n" + sj2.getName() + "\n"
+ sj2.getMessage());
return true;
}
return false;
}
}); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mSubText1 = (TextView) findViewById(R.id.subject_id_1);
mSubText2 = (TextView) findViewById(R.id.subject_id_2);
// 创建还有一个订阅者,bean先生
bean = new ObserverBean(mHandler);
// 生成主题的实例
mSubject = new Subject();
bean.setSubjcet(mSubject);
// 主题对象 把 观察者 加入进来,建立关联。一个主题可能有几个人感兴趣,例如以下。加入了2个观众
mSubject.addObserver(bean);
mSubject.addObserver(this);
runnable = new UpdateRunnable();
mHandler.postDelayed(runnable, 1000);
} // 假设主题内容变化了。会触发该方法。我们在这里更新显示主题的最新内容
@Override
public void update(Observable observable, Object data) {
Subject sj = null;
if (observable instanceof Subject) {
sj = (Subject) observable;
Log.d(TAG, "Subject-->"+sj.toString());
Message msg = mHandler.obtainMessage(1);
msg.obj = sj;
msg.sendToTarget();
}
} @Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacks(runnable);
mSubject.deleteObserver(this);
mSubject.deleteObserver(bean);
} /**
* 定时每隔一秒改变主题的内容
* @author jan
*/
class UpdateRunnable implements Runnable {
int i = 0; @Override
public void run() {
if (mSubject != null) {
i++;
mSubject.setId(i);
mSubject.setName(i + "活动日志");
mSubject.setMessage("今晚打老虎--" + i);
}
mHandler.postDelayed(this, 1000);
}
} }

5.最后的效果图

总结:观察者模式 就是 定义了 一系列对象之间的一对多关系。当一个对象改变状态,其它依赖者都会收到通知。

下载demo的链接

在推荐相关的博客:1.设计模式之七 --- 观察者模式(Observer)

2.Android Observer观察者模式

-------------------------------------------------------------------------------------更新线-----------------------------------------------------------------------------------------------------

时间:2015年7月24日

关于观察者模式在我们代码中,实际情况往往更加复杂。可能会有多重的组合,由于在java中Observable是一个抽象类。是一个类而不是接口。这使我们想要灵活的使用它比較困难,由于java类仅仅能继承一个类,不能像接口一样,多重继承。这也就是说我们最好自己可以实现类似的接口 去替代他。我在推荐的博客中的第一篇就是这么做的可以学习一下。

[Android&amp;Java]浅谈设计模式-代码篇:观察者模式Observer的更多相关文章

  1. 浅谈PHP代码设计结构

    浅谈PHP代码设计结构 您的评价:       还行  收藏该经验       coding多年,各种代码日夜相伴,如何跟代码友好的相处,不光成为职业生涯的一种回应,也是编写者功力的直接显露. 如何看 ...

  2. 设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

    设计模式 ( 十六 ) 观察者模式Observer(对象行为型) 1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来 ...

  3. 设计模式系列之观察者模式(Observer Pattern)

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作 ...

  4. java设计模式学习笔记--浅谈设计模式

    设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...

  5. 浅谈设计模式-visitor访问者模式

    先看一个和visitor无关的案例.假设你现在有一个书架,这个书架有两种操作,1添加书籍2阅读每一本书籍的简介. //书架public class Bookcase { List<Book> ...

  6. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  7. Spring源码分析 之浅谈设计模式

    一直想专门写个Spring源码的博客,工作了,可以全身性的投入到互联网行业中.虽然加班很严重,但是依然很开心.趁着凌晨有时间,总结总结. 首先spring,相信大家都很熟悉了. 1.轻量级  零配置, ...

  8. 【SSH 基础】浅谈Hibernate--入门篇

    Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object Relational Mapping)就是把对象里面的数据和数据库里面的数据,依 ...

  9. 浅谈设计模式及python实现

    设计模式及Python实现   设计模式是什么? Christopher Alexander:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.这样你就能一次又一次地使用 ...

随机推荐

  1. 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则未经解析。

    SELECT CONVERT(VARCHAR(100), 列名) FROM Table 提示错误: 无法执行 varchar 值到 varchar 的隐式转换,原因是,由于排序规则冲突,该值的排序规则 ...

  2. 输错密码?这个 sudo 会“嘲讽”你

    导读 你在 Linux 终端中会有很多的乐趣.我今天要讲的不是在终端中跑火车.我今天要讲的技巧可以放松你的心情.你学习过如何在命令行中增加 sudo 命令的超时,今天的文章中,我会向你展示如何让 su ...

  3. Netdata Linux下性能实时监测工具

    导读 本文将介绍一款非常好用的工具——Netdata,这是一款Linux性能实时监测工具,为一款开源工具,我对其英文文档进行了翻译,水平有限,有翻译错误的地方欢迎大家指出,希望本文对大家有所帮助,谢谢 ...

  4. UVA 11573 - Ocean Currents(BFS+优先队列)

    UVA 11573 - Ocean Currents 题目链接 题意:给定一个海面.数字分别代表海流方向,顺着海流不用费能量,逆海流要费1点能量,每次询问给一个起点一个终点,问起点到终点耗费的最小能量 ...

  5. Qt5 for Android: incompatible ABI

      I recently installed Qt5 and works like a charm for API 17 and armeabi-v7a.But I added second AVD ...

  6. [Tools] Target specific browsers with babel-preset-env and the babel pollyfill (browserslist)

    Converting all of our modern JavaScript into ES5 compatible syntax is a great way to use modern feat ...

  7. Coredata — 入门使用

    CoreData的底层实现尽管是使用的sqlite数据库.但是CoreData在使用起来但是和sqlite大相径庭.可能你会发现你连一句sql语句都不要写.CoreData存在于应用程序和持久化存储区 ...

  8. 在项目代码中载入cocostudio导出的动画并循环播放

    须要在代码中引入#include "cocostudio/CocoStudio.h" using namespace cocostudio; ArmatureDataManager ...

  9. 打通Fedora19的ssh服务

    Fedora19的SSH服务是默认关闭的,安装后我们需要打通它. 首先,编辑/etc/ssh/sshd_config,把下面黑体字部分打开注释,如下: #       $OpenBSD: sshd_c ...

  10. BZOJ 1264 AHOI2006 基因匹配Match 动态规划+树状数组

    题目大意:给定n个数和两个长度为n*5的序列,每一个数恰好出现5次,求两个序列的LCS n<=20000.序列长度就是10W.朴素的O(n^2)一定会超时 所以我们考虑LCS的一些性质 LCS的 ...