Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1332736
  • 博文数量: 185
  • 博客积分: 50
  • 博客等级: 民兵
  • 技术积分: 3934
  • 用 户 组: 普通用户
  • 注册时间: 2007-09-11 13:11
个人简介

iihero@ChinaUnix, ehero.[iihero] 数据库技术的痴迷爱好者. 您可以通过iihero AT qq.com联系到我 以下是我的三本图书: Sybase ASE in Action, Oracle Spatial及OCI高级编程, Java2网络协议内幕

文章分类

全部博文(185)

文章存档

2014年(4)

2013年(181)

分类: 项目管理

2013-07-26 10:42:59

概述

    定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
    最容易让人联系到的就是GUI用户界面当中数据和视图的对应关系,当数据发生变化时,它对应的所有的视图都自动更新。

适用性

    1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。
      将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

    2.当对一个对象的改变需要同时改变其它对象,而不知道具体有多少对象有待改变。

    3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。
			

参与者

    1.Subject(目标)
      目标知道它的观察者。可以有任意多个观察者观察同一个目标。
      提供注册和删除观察者对象的接口。

    2.Observer(观察者)
      为那些在目标发生改变时需获得通知的对象定义一个更新接口。

    3.ConcreteSubject(具体目标)
      将有关状态存入各ConcreteObserver对象。
      当它的状态发生改变时,向它的各个观察者发出通知。

    4.ConcreteObserver(具体观察者)
      维护一个指向ConcreteSubject对象的引用。
      存储有关状态,这些状态应与目标的状态保持一致。
      实现Observer的更新接口以使自身状态与目标的状态保持一致


类图

示例


  1. package com.sql9.actioned;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6.   
  7. /** 
  8.  * 观察者模式示例 
  9.  * @author iihero 
  10.  * 
  11.  */  
  12.   
  13. abstract class Subject {  
  14.     private List list = new ArrayList();  
  15.     private String data = "Initial";  
  16.     public void setData(String data) {  
  17.         this.data = data;  
  18.     }  
  19.     public String getData() {  
  20.         return data;  
  21.     }  
  22.     public void attach(Observer o) {  
  23.         list.add(o);  
  24.         o.setSubject(this);  
  25.     }  
  26.     public void detach(Observer o) {  
  27.         list.remove(o);  
  28.         o.setSubject(null);  
  29.     }  
  30.     public abstract void setState(String state);  
  31.     public abstract String getState();  
  32.     public void doNotify() {  
  33.         for (Observer o: list) {  
  34.             o.update();  
  35.         }  
  36.     }  
  37. }  
  38.   
  39. class ConcreteSubject extends Subject {  
  40.     String state;  
  41.       
  42.     @Override  
  43.     public void setState(String state) {  
  44.         this.state = state;  
  45.     }  
  46.   
  47.     @Override  
  48.     public String getState() {  
  49.         return state;  
  50.     }  
  51.       
  52. }  
  53.   
  54. abstract class Observer {  
  55.     protected Subject s;  
  56.     public Subject getSubject() {  
  57.         return s;  
  58.     }  
  59.     public void setSubject(Subject s) {  
  60.         this.s = s;  
  61.     }  
  62.     public abstract void update();  
  63. }  
  64.   
  65. class ConcreteObserver extends Observer {  
  66.     private String observerName;  
  67.     public ConcreteObserver(String name) {  
  68.         this.observerName = name;  
  69.     }  
  70.     @Override  
  71.     public void update() {  
  72.         System.out.println("In Observer " + this.observerName + " data from subject: " + this.s.getData());  
  73.     }  
  74.   
  75.       
  76. }  
  77.   
  78.   
  79.   
  80. public class ObserverTest {  
  81.   
  82.     public static void main(String[] args) {  
  83.         ConcreteSubject s = new ConcreteSubject();  
  84.         ConcreteObserver o1 = new ConcreteObserver("first observer");  
  85.         ConcreteObserver o2 = new ConcreteObserver("second observer");  
  86.         ConcreteObserver o3 = new ConcreteObserver("second observer");  
  87.   
  88.         s.attach(o1);  
  89.         s.attach(o2);  
  90.         s.attach(o3);  
  91.   
  92.         // make changes to subject  
  93.         s.setData("This is important subject data");  
  94.   
  95.         // Notify all observers  
  96.         s.doNotify();   
  97.     }  
  98.   
  99. }  



结果


  1. In Observer first observer data from subject: This is important subject data  
  2. In Observer second observer data from subject: This is important subject data  
  3. In Observer second observer data from subject: This is important subject data  

阅读(1601) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~