回调函数升级版-设计模式(观察者模式)

原创 2015年07月07日 14:32:02

书接上回,上一周大体写了一下回调函数的使用,这周我就大体说一下设计模式中的观察者模式。我自己认为观察模式就是回调函数的升级版,在用法上。废话少说,直接上图。

这是我正在弄的一个应用,画面有点模仿荔枝电台了,在这里感谢荔枝电台提供这么简洁的UI。本来这个项目的第一版使用的模式是回调加广播的形式。但是在重构代码的时候,我想了想何不使用观察者模式呢,这样能减少很多不必要的麻烦。

简单地说,观察者模式定义了一个一对多的依赖关系(也可以一对一),让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者对象能够自动更新。通过这个解释,大家是不是认为上面的这个项目使用观察者模式是可不错的选择呢。哈哈,继续闲扯。

我不想画那种UML图(因为我水平有限,画不好,哈哈哈),我怕画多了自己迷糊了,也把你们弄迷糊了,如果需要看到的话,可以留言,到时我在认真的给补上。

观察者模式有观察者和被观察的对象。上面的那个项目,各个Activity是观察者,播放的类是被观察者,所以观察者不知道有多少个观察者,只做好自己的工作就可以,根据需求进行变化。

第一步:被观察者和观察者的两个类:

这里是被观察者的抽象类;

<pre name="code" class="html">package com.lbc.observer;

import java.util.ArrayList;
import java.util.List;

public abstract class Subject {

	private List<Observer> observers = new ArrayList<Observer>();

	//这个代替我们要观察的状态
	public String str;

	public void addObserver(Observer observer) {

		if (!observers.contains(observer)) {
			observers.add(observer);
		}
	}

	public void removeObserver(Observer observer) {

		if (observers.contains(observer)) {
			observers.remove(observer);
		}
	}

	/**
	 * 把一个类的对象给观察者
	 * 
	 * 这里可以修改成和上篇回调函数一样的样式,推送变量给观察者
	 * http://blog.csdn.net/liujianshui/article/details/46709229
	 */
	public void nodifyObservers() {
		for (Observer observer : observers) {
			observer.update(Subject.this);
		}
	}

	public String getStr() {
		return str;
	}

	public void setStr(String str) {
		this.str = str;
	}
}


这里是观察者的接口类:

package com.lbc.observer;

public interface Observer {

	//这里你可以定义好几个方法
	public void update(Subject s);
}

2.现在要完成的是继承了Subject这个抽象类的子类,和实现了Observer这个接口的子类:

这是继承了Subject这个抽象类的子类

package com.lbc.observer;

public class MySubject extends Subject {

	
	public void changMethod() {
		// 设置我们的状态
		setStr("大家好,我是被观察者的子类哦");
		// 唤醒观察者
		nodifyObservers();
	}

}


我为了简单,把实现了Observer这个接口的子类用匿名内部类的形式写出来。
package com.lbc.observer;

public class Test {

	public static void main(String[] args) {
		MySubject mySubject = new MySubject();

		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第一个观察者" + s.getStr());
			}
		});
		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第二个观察者"+s.getStr());
			}
		});
		mySubject.addObserver(new Observer() {

			@Override
			public void update(Subject s) {
				System.out.println("第三个观察者"+s.getStr());
			}
		});
		mySubject.changMethod();
	}
}

这样简单的观察者模式就算结束了,但是真正在工作了,没有这么简单,还需要大家学会变通。如果上面看不懂的话,就留言,我把代码发给你。希望大家多多批评指正,让我能有进步。生命不止,学习不休。加油。由于上面的项目代码有保密条例,不方便发,但是大家有这方面问题,我们可以讨论哦。

下周的博客打算写代理模式,但是我不知道能不能找到一个好的例子表达这个代理模式,找到就写,找不到就改题材,哈哈。希望顺利。

相关文章推荐

回调设计模式

0. 引言 使用过SDK的朋友应该知道“回调函数”(callback function)这个概念,但本文并不是介绍如何使用回调函数,而是站在SDK开发者的角度,讲述如何实现回调机制。 ...

Java设计模式-回调函数和观察者模式

Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。 下面是回调的基本模型: public class A { private CallBack...

观察者模式(Observer Pattern)升级版

简介前面的博客https://goo.gl/DFOz50中已经介绍过基本的观察者模式的代码实现,在实际应用中,我们往往希望代码更加简洁,同时也希望能与现有的框架,比如Spring,结合起来。下面介绍如...

【设计模式】不就是换DB嘛(二)——升级版抽象工厂+反射+配置文件

上一篇博客和大家分享了抽象工厂在实践管理系统时能为我们带来的好处,同时也给大家提了抽象模式更改DB的几个问题,那么增加功能时有什么方法不需要更改添加那么多类呢? 换数据库的时候可不可以不更改程序呢? ...

【Unity技巧】统一管理回调函数——观察者模式

这次的内容有点类似设计模式里的观察者模式。但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过。 开场白 我们来想...

【Unity】中如何统一管理回调函数(利用观察者模式)

这次的内容有点类似设计模式里的观察者模式。但是和常规意义上的观察者模式也不是完全一致,所以各位就不要咬文嚼字啦!咦?设计模式?!不懂!没关系,说不定你以前就用过。 开场白 ...

利用观察者模式来获取线程中的数据或者回调函数

首先//抽象主题角色,watched:被观察 public interface Watched { public void addWatcher(Watcher watcher); ...

Java的回调函数和观察者模式的区别

前一段时间研究了一下设计模式,突然想到观察者模式和回调函数之间的联系,网上也没有什么人说清楚,便自己又仔细想了想,便有了如下观点,欢迎各位大神前来拍砖!     首先,先阐述一下网上说的,网上先说...

关于回调函数的理解,以及观察者模式,代理模式

今天在学习Android的时候,突然看到“回调函数”这个关键字,但是却在脑海中找不到相应的映射。于是去一些CSDN博客上恶补了关于回调函数的知识。...

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous)。 “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行;程序的执行顺序和排...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回调函数升级版-设计模式(观察者模式)
举报原因:
原因补充:

(最多只允许输入30个字)