设计模式-观察者模式

原创 2012年03月21日 17:06:55
最近用seam框架,发现所有的event都可以通过定义观察者去观察,很好很强大,遂有感研究下设计模式中的观察者模式。

GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。
怎么理解呢,简单起见,以家长和老师对学生考试成绩的观察为例。

先定义一个通用观察者接口:

package com.db.observer;
public interface ObserverInterface {
	public abstract void update(Student stu);
}

再定义一个学生类:
package com.db.observer;

import java.util.Iterator;
import java.util.Random;

public class Student {
	
	private int score;
	
	public void changeScore(){
		score = (new Random()).nextInt(100);
		notifyObserver();
	}

	public int getScore() {
		return score;
	}
	
	private void notifyObserver(){
		if(ObserverGen.oi!=null && !ObserverGen.oi.isEmpty()){
			Iterator<ObserverInterface> e = ObserverGen.oi.iterator();
			while(e.hasNext()){
				e.next().update(this);
			}
		}
	}
}

再定义两个观察者:一个是家长,一个老师
package com.db.observer;

public class ParentOberver implements ObserverInterface{
	
	@Override
	public void update(Student stu) {
		if(stu.getScore()>80){
			System.out.println("Score="+stu.getScore()+",Parent:^_^");
		}else{
			System.out.println("Score="+stu.getScore()+",Parent:>_<");
		}
	}

}

package com.db.observer;

public class TeacherObserver implements ObserverInterface {

	@Override
	public void update(Student stu) {
		if(stu.getScore()>80){
			System.out.println("Score="+stu.getScore()+",Teacher:You're brilliant!");
		}else{
			System.out.println("Score="+stu.getScore()+",Teacher:Don't be a chicken!");
		}
	}
}

为了以后可以很方便地添加其他的观察者(比如亲戚,同学,女友等等),应该定义一个观察者注册器:
package com.db.observer;

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

public class ObserverGen {
	public static List<ObserverInterface> oi = new ArrayList<ObserverInterface>();
}
下面看测试代码:
package com.db.observer;
public class TestObserver {
	public static void main(String[] args) {
		ObserverInterface pob = new ParentOberver();
		ObserverInterface tob = new TeacherObserver();
		
		ObserverGen.oi.add(pob);
		ObserverGen.oi.add(tob);
		
		(new Student()).changeScore();
	}
}

某次运行结果:
Score=99,Parent:^_^
Score=99,Teacher:You're brilliant!


我们可以看到,当学生的成绩发生变化时,所依赖的对象(家长和老师)都及时得到了通知并自动更新了状态。
题外话:Seam框架里定义了很多有用的观察者事件,通过annotations使用起来,非常灵活,这种设计思想很值得我们去借鉴。


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

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

[设计模式as3版]二.观察者模式

发布者package { public interface Subject { function addObserver(observer:Observer):void; funct...
  • liushen829475
  • liushen829475
  • 2013年06月21日 18:00
  • 594

设计模式C++实现——观察者模式

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。        观察者模式结构图如下:                举例:      ...
  • walkerkalr
  • walkerkalr
  • 2014年06月04日 19:51
  • 1168

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

在上篇设计模式上我们继续前进把,苦逼(酷毙)的程序员一刻都不能松懈的,要紧跟脚步,每天都学习啊!!学了策略模式,我自己去用设计模式写了几个例子,感觉还扣以啊。下面继续总结一下观察者模式的学习,如有不正...
  • qq_29282475
  • qq_29282475
  • 2015年12月07日 16:16
  • 1243

Java设计模式(观察者模式JDK自带)

JDK自带的观察者模式和我们上一节说的基本相似,也有通用的观察协议规则 Observer,这个接口中只有一个方法,就是update方法 public interface Observer { ...
  • xyjwsj
  • xyjwsj
  • 2017年02月15日 16:47
  • 669

设计模式--观察者模式、状态模式

【观察者模式】          多个观察者同时监听一个主题,一旦主题对象发生改变便会通知所有的观察者对象,并相应自己的更新事件!                                   ...
  • u012466304
  • u012466304
  • 2014年12月09日 17:40
  • 1909

Java设计模式之观察者模式

本文继续介绍23种设计模式系列。介绍的是观察者模式。
  • jason0539
  • jason0539
  • 2015年04月16日 07:32
  • 29902

Android设计模式(十一)-观察者模式

观察者模式是一种使用频率非常高的设计模式,最常用的地方就是订阅-发布系统。这个模式的重要作用就是将观察者和被观察者解耦,使他们之间的依赖更小甚至没有。定义定义对象一种一对多的依赖关系,使得每当一个对象...
  • qq_25806863
  • qq_25806863
  • 2017年04月05日 00:26
  • 563

设计模式在游戏开发中的应用之观察者模式

观察者模式 1.通俗的定义         触发事件的一方不关心谁来处理,处理事件的一方不关心事件是从哪里来的。观察者模式就是让观察者与被观察者彻底解耦。 2.2.结构图如下(图片来源与网络): ...
  • yue19870813
  • yue19870813
  • 2016年11月12日 16:44
  • 643

JavaScript设计模式--观察者模式

一、定义观察者模式(发布-订阅模式):其定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。 在JavaScript中,一般使用事件模型来替代传统的观察者模式...
  • ligang2585116
  • ligang2585116
  • 2015年12月20日 19:22
  • 4889
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式-观察者模式
举报原因:
原因补充:

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