观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐、电子产品、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. Android -- 自定义标题栏,背景颜色填充满

    设置标题栏背景 1> 准备背景图片: background_pix.png 注:用背景图片比用颜色好处,可以让背景看起来有凹凸感. 2> drawable文件夹下放xml文件 bitmap ...

  2. 【转】十个经典的C开源项目代码

    原文: http://blog.51cto.com/chinalx1/2143904 --------------------------------------------------------- ...

  3. PasswordlessAPI

    passwordlessapiYOURLS允许API调用的老式的方法,使用用户名和密码参数(如果你的设置是私人的,很明显).如果担心将证书发送到野外,还可以使用秘密签名令牌进行API调用.签名的令牌你 ...

  4. [Big Data] Week4B (Basic)

    Question 1 Note: In this question, all columns will be written in their transposed form, as rows, to ...

  5. 【python】理想论坛帖子爬虫1.06

    昨天认识到在本期同时起一百个回调/线程后程序会崩溃,造成结果不可信. 于是决定用Python单线程操作,因为它理论上就用主线程跑不会有问题,只是时间长点. 写好程序后,测试了一中午,210个主贴,11 ...

  6. 如何安装Tomcat

    1 请确认已经安装了JRE或JDK并配置好了环境变量,关于如何配置环境变量,参考我的另一篇文章"WIN7如何配置java环境变量,运行环境.doc" 2 用记事本打开bin目录下的 ...

  7. Websocket——Websocket原理

    偶然在知乎上看到一篇回帖,瞬间认为之前看的那么多资料都不及这一篇回帖让我对 websocket 的认识深刻有木有.所以转到我博客里,分享一下.比較喜欢看这样的博客,读起来非常轻松.不枯燥,没有布道师的 ...

  8. Centos 7 minimal install 后的基础配置

    Centos 7 基础设置: 修改默认语言: 不再是修改 /etc/sysconfig/i18n, 而是要修改 /etc/locale.conf, 以及 /etc/yum/pluginconf.d/l ...

  9. WinForm如何调用Web Service

    参考地址 今天看了李天平关于WinForm调用Web Service的代码,我自己模仿做一个代码基本都是复制粘贴的,结果不好使.郁闷的是,又碰到那个该死的GET调用Web Service,我想肯定又是 ...

  10. JavaScript中的call、apply、bind方法的区别

    在JavaScript 中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply 和bind这 ...