读书人

设计方式学习笔记(七)Observer观察者

发布时间: 2012-09-27 11:11:17 作者: rapoo

设计模式学习笔记(七)—Observer观察者模式
《设计模式》一书对Observer是这样描述的:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
举个例子,在现实生活中,父母与孩子是最亲密的人。父母做为孩子(被观察者)的监护人(观察者),当孩子和别人打架后,一定会告诉他的父母这件事(呵呵,当孩子很小时,通常会告诉父母,长大了以后,可能不会,这里的孩子指的是小孩子),当孩子获得奖学金后,也一定会告诉他的父母。下面我用Observer实现这个程序。代码如下:
《设计模式》一书对Observer是这样描述的:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
举个例子,在现实生活中,父母与孩子是最亲密的人。父母做为孩子(被观察者)的监护人(观察者),当孩子和别人打架后,一定会告诉他的父母这件事(呵呵,当孩子很小时,通常会告诉父母,长大了以后,可能不会,这里的孩子指的是小孩子),当孩子获得奖学金后,也一定会告诉他的父母。下面我用Observer实现这个程序。代码如下:

import java.util.Vector;class Children{ static private Vector<Observer> obs; static private String state=null; static{  obs=new Vector<Observer>(); } public static void attach(Observer o){  obs.addElement(o); } public static void detach(Observer o){  obs.removeElement(o); } public void setState(String str){  state=str; } public String getState(){  return state; } public void notifyObs(){  for(Observer o:obs){   o.update(this);   } }}interface Observer{ public void update(Children child);}class Parent implements Observer{ public void update(Children child){  if(child.getState().equals("fight")){   System.out.println("Parent,他和别人打架了");  }else if(child.getState().equals("scholarship")){   System.out.println("告诉Parent,他得到了奖学金");  } }}class Mother implements Observer{ public void update(Children child){  if(child.getState().equals("fight")){   System.out.println("告诉Mother,他和别人打架了");  }else if(child.getState().equals("scholarship")){   System.out.println("告诉Mother,他得到了奖学金");  } }}public class Client { public static void main(String[] args) {  Children child=new Children();  Observer parent=new Parent();  Observer mother=new Mother();  child.attach(parent);  child.attach(mother);  child.setState("fight");  child.notifyObs();  child.setState("scholarship");  child.notifyObs(); }}

输出如下:
告诉Parent,他和别人打架了
告诉Mother,他和别人打架了
告诉Parent,他得到了奖学金
告诉Mother,他得到了奖学金
小结:对于Observer模式,触发事件的对象-Subject对象无法预测可能需要知道该事件的所有对象。为了解决这一问题,我们创建一个Observer接口,要求所有的Observer负责将自己注册到Subject上。

读书人网 >软件开发

热点推荐