Java的API中有两组接口类是用来写观察者模式用的,分别是java.util.Observable、java.util.Observer 和java.util.EventListener、Java.util.EventObject。本文并没有直接使用到这些API,而是自定义一套观察 者模式中相关的接口类,且选取一个日常生活中常见的一个事件来说明观察者模式的使用。

观察者模式(Observer Pattern)的例子

现实场景:有一名店(Shop),为了财物安全起见,除了在店内装了摄像头(Camera)来监控店内的总人数外,还聘请了一些门卫(Camera)守在店门口,对来访的客人进行实名登记,即客人进入时要记名,客人出店时也要记录其离去。

//Watcher接口:

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
/**
观察者模式(Observer Pattern)的例子  * 观察者接口
观察者模式(Observer Pattern)的例子  * 
@author  rongxinhua
观察者模式(Observer Pattern)的例子  *
观察者模式(Observer Pattern)的例子  
*/

观察者模式(Observer Pattern)的例子
public   interface  Watcher  {
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * (接收到通知后,)观察者采取行动
观察者模式(Observer Pattern)的例子      * 
@param  msg
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
public   void  takeAction(Object 观察者模式(Observer Pattern)的例子  msg);
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子 }

观察者模式(Observer Pattern)的例子


//Watchable类:

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
import  java.util.HashSet;
观察者模式(Observer Pattern)的例子
import  java.util.Set;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
/**
观察者模式(Observer Pattern)的例子  * "被观察对象" 的父类
观察者模式(Observer Pattern)的例子  * 
@author  rongxinhua
观察者模式(Observer Pattern)的例子  *
观察者模式(Observer Pattern)的例子  
*/

观察者模式(Observer Pattern)的例子
public   class  Watchable  {
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
private  Set < Watcher >  watcherSet  =   new  HashSet < Watcher > ();
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 通知观察者
观察者模式(Observer Pattern)的例子      * 
@param  params 通知的信息数组
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
protected   void  notifyWatchers(Object观察者模式(Observer Pattern)的例子  params) {
观察者模式(Observer Pattern)的例子         
for (Watcher watcher : watcherSet)  {
观察者模式(Observer Pattern)的例子             watcher.takeAction(params);        
// 观察者采取行动
观察者模式(Observer Pattern)的例子
        }

观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 增加观察者
观察者模式(Observer Pattern)的例子      * 
@param  watcher
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
protected   void  addWatcher(Watcher watcher) {
观察者模式(Observer Pattern)的例子         watcherSet.add(watcher);
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 移除观察者
观察者模式(Observer Pattern)的例子      * 
@param  watcher
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
protected   void  removeWatcher(Watcher watcher)  {
观察者模式(Observer Pattern)的例子         watcherSet.remove(watcher);
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子 }

 
//Shop类,继承了Watchable类,Shop内有什么动静,会通过调用父类的notifyWatcher()方法通知观察者。

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
import  java.util.HashSet;
观察者模式(Observer Pattern)的例子
import  java.util.Set;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
/**
观察者模式(Observer Pattern)的例子  * 店类,可被观察的
观察者模式(Observer Pattern)的例子  * 
@author  rongxinhua
观察者模式(Observer Pattern)的例子  *
观察者模式(Observer Pattern)的例子  
*/

观察者模式(Observer Pattern)的例子
public   class  Shop  extends  Watchable  {
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子     
static  String IN  =   " in " ;     // 进入
观察者模式(Observer Pattern)的例子
     static  String OUT  =   " out " ;     // 出去
观察者模式(Observer Pattern)的例子
    
观察者模式(Observer Pattern)的例子     Set
< String >  personSet  =   new  HashSet < String > ();
观察者模式(Observer Pattern)的例子     
int  pcount  =   0 ;         // 店内总人数
观察者模式(Observer Pattern)的例子
    
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 来访登记
观察者模式(Observer Pattern)的例子      * 
@param  name
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
public   void  comeIn(String name) {
观察者模式(Observer Pattern)的例子         personSet.add(name);
观察者模式(Observer Pattern)的例子         pcount 
=  personSet.size();
观察者模式(Observer Pattern)的例子         notifyWatchers(IN, name, pcount);    
// 通知观察者
观察者模式(Observer Pattern)的例子
    }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 出店登记
观察者模式(Observer Pattern)的例子      * 
@param  name 
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
public   void  getOut(String name) {
观察者模式(Observer Pattern)的例子         personSet.remove(name);
观察者模式(Observer Pattern)的例子         pcount 
=  personSet.size();
观察者模式(Observer Pattern)的例子         notifyWatchers(OUT, name, pcount);    
// 通知观察者
观察者模式(Observer Pattern)的例子
    }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子 }


//Guard(门卫类)和Camera(摄像头类)都属于本例中的观察者,负责观察店内外的动静,

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
/**
观察者模式(Observer Pattern)的例子  * 门卫(保安)类
观察者模式(Observer Pattern)的例子  * 
@author  rongxinhua
观察者模式(Observer Pattern)的例子  *
观察者模式(Observer Pattern)的例子  
*/

观察者模式(Observer Pattern)的例子
public   class  Guard  implements  Watcher  {
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
private  String name;     // 门卫姓名
观察者模式(Observer Pattern)的例子

观察者模式(Observer Pattern)的例子     
public  Guard() {}
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
public  Guard(String name) {
观察者模式(Observer Pattern)的例子         
this .name  =  name;
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     @Override
观察者模式(Observer Pattern)的例子     
public   void  takeAction(Object 观察者模式(Observer Pattern)的例子  msg)  {
观察者模式(Observer Pattern)的例子         
if (msg[ 0 ].equals( " in " )) {
观察者模式(Observer Pattern)的例子             System.out.println(
this .name  +   " 向管理处汇报:“ "   +  msg[ 1 +   " ”已进入本店! " );
观察者模式(Observer Pattern)的例子         }

观察者模式(Observer Pattern)的例子         
else   if (msg[ 0 ].equals( " out " )) {
观察者模式(Observer Pattern)的例子             System.out.println(
this .name  +   " 向管理处汇报:“ "   +  msg[ 1 +   " ”已走出本店! " );
观察者模式(Observer Pattern)的例子         }

观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子 }

 

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
/**
观察者模式(Observer Pattern)的例子  * 摄像头类
观察者模式(Observer Pattern)的例子  * 
@author  rongxinhua
观察者模式(Observer Pattern)的例子  *
观察者模式(Observer Pattern)的例子  
*/

观察者模式(Observer Pattern)的例子
public   class  Camera  implements  Watcher  {
观察者模式(Observer Pattern)的例子     
观察者模式(Observer Pattern)的例子     
private   int  id;         // 摄像头编号
观察者模式(Observer Pattern)的例子
    
观察者模式(Observer Pattern)的例子     
public  Camera( int  id) {
观察者模式(Observer Pattern)的例子         
this .id  =  id;
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子     @Override
观察者模式(Observer Pattern)的例子     
public   void  takeAction(Object观察者模式(Observer Pattern)的例子  msg)  {
观察者模式(Observer Pattern)的例子         System.out.println(
" 摄像头 "   +  id  +   " 号监测到现在店内总人数为 "   +  msg[ 2 +   " " );
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子 }


//测试类代码:

观察者模式(Observer Pattern)的例子package  simple.observer;
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子
public   class  Test02  {
观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子     
/**
观察者模式(Observer Pattern)的例子      * 
@param  args
观察者模式(Observer Pattern)的例子      
*/

观察者模式(Observer Pattern)的例子     
public   static   void  main(String[] args)  {
观察者模式(Observer Pattern)的例子         Shop shop 
=   new  Shop();
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 添加摄像头1号
观察者模式(Observer Pattern)的例子
        Camera camera  =   new  Camera( 1 );
观察者模式(Observer Pattern)的例子         shop.addWatcher(camera);
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 添加门卫一号
观察者模式(Observer Pattern)的例子
        Guard guard1  =   new  Guard( " 门卫一号 " );
观察者模式(Observer Pattern)的例子         shop.addWatcher(guard1);
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 来访登记、出门登记
观察者模式(Observer Pattern)的例子
        shop.comeIn( " BlogJava " );
观察者模式(Observer Pattern)的例子         shop.comeIn(
" JavaEye " );
观察者模式(Observer Pattern)的例子         shop.getOut(
" BlogJava " );
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 移除门卫一号,派他去做别的事
观察者模式(Observer Pattern)的例子
        shop.removeWatcher(guard1);    
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 进入无人观察状态,随进随出
观察者模式(Observer Pattern)的例子
        shop.comeIn( " CSDN " );
观察者模式(Observer Pattern)的例子         shop.getOut(
" JavaEye " );
观察者模式(Observer Pattern)的例子         shop.comeIn(
" 心梦帆影 " );
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 添加门卫二号
观察者模式(Observer Pattern)的例子
        Guard guard2  =   new  Guard( " 门卫二号 " );
观察者模式(Observer Pattern)的例子         shop.addWatcher(guard2);
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子         
// 来访登记,出门登记
观察者模式(Observer Pattern)的例子
        shop.comeIn( " 容新华 " );
观察者模式(Observer Pattern)的例子         shop.getOut(
" CSDN " );
观察者模式(Observer Pattern)的例子         
观察者模式(Observer Pattern)的例子     }

观察者模式(Observer Pattern)的例子
观察者模式(Observer Pattern)的例子 }


运行测试类,结果如下:

 1 观察者模式(Observer Pattern)的例子门卫一号向管理处汇报:“BlogJava”已进入本店!
 2 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为1人
 3 观察者模式(Observer Pattern)的例子 门卫一号向管理处汇报:“JavaEye”已进入本店!
 4 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为2人
 5 观察者模式(Observer Pattern)的例子 门卫一号向管理处汇报:“BlogJava”已走出本店!
 6 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为1人
 7 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为2人
 8 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为1人
 9 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为2人
10 观察者模式(Observer Pattern)的例子 门卫二号向管理处汇报:“容新华”已进入本店!
11 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为3人
12 观察者模式(Observer Pattern)的例子 门卫二号向管理处汇报:“CSDN”已走出本店!
13 观察者模式(Observer Pattern)的例子 摄像头1号监测到现在店内总人数为2人

相关文章: