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

原创 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();
	}
}

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

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

设计模式之回调模式

回调在Spring中被大量使用,那什么是回调呢?        简单的说,在A类中调用B类的C方法,然后B类调用A类中的D方法。方法D被称为回调方法。回调是实现异步的基础。经典的回调方式如下: Cl...
  • c275046758
  • c275046758
  • 2016年05月26日 17:37
  • 2928

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

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

观察者模式与回调机制的关系

观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。  我们上例的回调机制可以把Caller作为一个主题(被观察者),Callee1作为观察者...
  • xyls12345
  • xyls12345
  • 2014年05月21日 11:26
  • 3243

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

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

Java 回调函数 与 观察者模式

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目...
  • chy555chy
  • chy555chy
  • 2016年10月10日 15:11
  • 631

回调函数和观察者模式

Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。 下面是回调的基本模型: [java] view plain...
  • yxwbtb
  • yxwbtb
  • 2015年07月15日 17:13
  • 2932

Android监听——回调模式与观察者模式

  • 2016年03月24日 00:12
  • 1.38MB
  • 下载

当观察者模式和回调机制遇上Android源码

上一篇博客跟大家分享了Android源码中的装饰者模式,有点意犹未尽,今天跟大家分享下Android中的观察者模式,顺便说一说观察者模式和回调机制的关系,欢迎大家拍砖。...
  • sdkfjksf
  • sdkfjksf
  • 2016年09月23日 16:54
  • 5025

设计模式(五)观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听莫一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们...
  • itachi85
  • itachi85
  • 2016年03月02日 17:41
  • 40425

设计模式-深入解析观察者模式(Observer)

在上篇设计模式上我们继续前进把,苦逼(酷毙)的程序员一刻都不能松懈的,要紧跟脚步,每天都学习啊!!学了策略模式,我自己去用设计模式写了几个例子,感觉还扣以啊。下面继续总结一下观察者模式的学习,如有不正...
  • qq_29282475
  • qq_29282475
  • 2015年12月07日 16:16
  • 1320
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回调函数升级版-设计模式(观察者模式)
举报原因:
原因补充:

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