设计模式(观察者模式)

本贴最后更新于 2421 天前,其中的信息可能已经时过境迁

观察者模式分离了观察者和被观察者自身的责任,让类各自维护自己的功能,提高了系统的可重用性。

怎么做?

  1. 通过使用 JDK 中提供的{@link java.util.Observable} 以及 {@link java.util.Observer} 这两个类即可完成简单的观察者模式。

代码示例:


import java.util.Observable;
import java.util.Observer;

/**
 * 通过使用JDK中提供的{@link java.util.Observable} 以及 {@link java.util.Observer} 这两个类即可完成简单的观察者模式。
 * 
 * <p>
 * {@link Observable} 主要维护观察者(即被通知对象), 实现了 {@link Observer} 该接口表明是一个观察者,会被强制实现update方法来处理接收到通知后的行为,
 * 当发生改变后,<code>Observable.notifyObservers()</code> 会遍历所有的观察者update方法
 * 
 * @author pleuvoir
 *
 */
public class Teacher extends Observable {

	public void homeworkIsComing(String workname) {
		System.out.println("当前有" + countObservers() + "个通知对象");
		setChanged();
		notifyObservers(workname + "来了");
	}
	
	
	public static class Student implements Observer{
		public void update(Observable o, Object arg) {
			Teacher teacher = (Teacher) o;
			System.out.println(this.getClass().getName()  + "收到" + teacher.getClass().getName() + "通知" + arg.toString());
		}
	}
	
	
	public static void main(String[] args) {
		Teacher teacher = new Teacher();
		for (int i = 0; i < 9; i++) {
			teacher.addObserver(new Student());
		}
		teacher.homeworkIsComing("寒假作业");
	}

}

结果:

当前有9个通知对象
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了

结论

  1. 观察看上去是一个主动的行为,但是其实观察者不是主动调用自己的业务代码的,相反,是被观察者调用的。
  2. 基于此的还有更为具体的发布订阅模式和事件机制。
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3453 回帖 • 203 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...