[Android&Java]设计模式代码篇:观察者模式

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

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

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.最后的效果图

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 16:29:01

[Android&Java]设计模式代码篇:观察者模式的相关文章

[Android&amp;amp;Java]浅谈设计模式-代码篇:观察者模式Observer

观察者,就如同一个人,对非常多东西都感兴趣,就好像音乐.电子产品.Game.股票等,这些东西的变化都能引起爱好者们的注意并时刻关注他们.在代码中.我们也有这种一种方式来设计一些好玩的思想来.今天就写个Demo来描写叙述一下这种思想,用java内置的Observer来实现这一思想. 好,程序猿是不善言语的,看代码先. 1.demo的结构: 2.先创建我们的主题类Subject,他就是我们本demo的明星类.继承了Observable,顾名思义,就是被观察的类 .其它观察者对他但是虎视眈眈哦(事实上

java设计模式 GOF23 12 观察者模式

一.观察者模式简介 当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系. 二.实际应用 聊天室,消息订阅 在这些应用场景下,订阅者和聊天客户端称之为观察者,需要同步到多个订阅者的数据封装到对象中, 称之为目标. 三.模式核心 观察者模式是一对多的通知,当一个对象发生变化时,他需要告诉每一个对象. 通知观察者的方式: 1)推:观察者只能被动接受消息 2)拉:观察者可以自行决定是否接收消息. 消息对象通过容器存放所有观察者,消息更新时通过遍历容器通知每一个观

java设计模式之:观察者模式

package Observer; public class Test { /** * 客户端测试类 * 观察者模式一般由四部分组成: * 1抽象的被观察者(一般教材上都叫做"Subject(抽象的主题类)"), * 里面一般定义了抽象的add(),remove(),notifyAll()等方法, * 分别用于增加观察者,删除观察者,通知观察者自己的变化. * 2具体的观察者类(一般教材上都叫做"ConcreteSubject(具体的主题类)"), * 是抽象的被观

理解java设计模式之观察者模式

在生活实际中,我们经常会遇到关注一个事物数据变化的情况,例如生活中的温度记录仪,当温度变化时,我们观察它温度变化的曲线,温度记录日志等.对于这一类问题,很接近java设计模式里面的“观察者模式”,它适合解决多种对象跟踪一个对象数据变化的程序结构问题. 观察者设计模式涉及到两种角色:主题(Subject)和观察者(Observer) 下面以java JDK中已有的观察者设计模式代码,展示使用: 1.主题(Subject):Observable类派生出来的子类,只需要定义各被监控的数据及getter

android流媒体之硬编码【代码篇】

转载此处:http://www.apkbus.com/blog-86476-43829.html 上一篇文章进行了思路和16进制文件的分析.这篇该代码实现了.目前没有在真实手机上测试, android4.0之后的模拟器可以用模拟摄像头或者叫做webcam的[其实就是笔记本摄像头].之后会在程序安装包data/data/edu.ustb.videoencoder/下面会有h264.3gp,sps[存放sps数据].pps[存放pps数据].media.xml[存放找到mdat的位置],/sdcar

java设计模式--观察者模式和事件监听器模式

文章转载于:http://www.java2000.net/p9452 复习设计模式,看到observer观察者模式,说法是该模式和iterator迭代器模式类似已经被整合进jdk,但是jdk提供了两种接口: 一.java.util.Observer -- 观察者接口 对应: java.util.Observable --受查者根类 二.java.util.EventListener -- 事件监听/处理接口 对应: java.util.EventObject -- 事件(状态)对象根类 研究了

Java(Android)线程池---基础篇

1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 newThread(newRunnable(){ 2 3 @Override 4 publicvoidrun(){ 5 // TODO Auto-generated method stub 6 } 7 }).start(); 那你就out太多了,new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致

java设计模式-观察者模式学习

最近学习了设计模式中的观察者模式,在这里记录下学习成果. 观察者模式,个人理解:就是一个一对多模型,一个主体做了事情,其余多个主体都可以观察到.只不过这个主体可以决定谁去观察他,以及做什么事情可以给别人观察. 引用大师的话就是 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式.模型-视图(Model/View)模式.源-监听器(Source/Listener)模式或从属者(Dependents)模式. 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时

如何分析android的OOM,与java静态代码分析工具

用MAT分析OOM 很多OOM看似发生在bitmap 分配得时候,但它一般不是rootcause.根本原因都在于本应该自动释放的资源,因为代码的错误,而导致某些对象一直被引用(Reference),例如 Android 内存优化,如何避免OOM 文章中提到的Activity 的mContext 引用. 当代码量很庞大的时候,单靠读代码查找错误是很困难的,所以必须借助于工具,这里介绍一款很好用的分析工具MAT. 1.下载MAT http://www.eclipse.org/mat/download