`
henryyang
  • 浏览: 111685 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

clip_image002[13]

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

//Watcher接口:

package  simple.observer;

/**
 * 观察者接口
 * 
@author  rongxinhua
 *
 
*/

public   interface  Watcher  {

    
/**
     * (接收到通知后,)观察者采取行动
     * 
@param  msg
     
*/

    
public   void  takeAction(Object   msg);
    
}


//Watchable类:

package  simple.observer;

import  java.util.HashSet;
import  java.util.Set;

/**
 * "被观察对象" 的父类
 * 
@author  rongxinhua
 *
 
*/

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

    
protected   void  notifyWatchers(Object  params) {
        
for (Watcher watcher : watcherSet)  {
            watcher.takeAction(params);        
// 观察者采取行动
        }

    }

    
    
/**
     * 增加观察者
     * 
@param  watcher
     
*/

    
protected   void  addWatcher(Watcher watcher) {
        watcherSet.add(watcher);
    }

    
    
/**
     * 移除观察者
     * 
@param  watcher
     
*/

    
protected   void  removeWatcher(Watcher watcher)  {
        watcherSet.remove(watcher);
    }

    
}

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

package  simple.observer;

import  java.util.HashSet;
import  java.util.Set;

/**
 * 店类,可被观察的
 * 
@author  rongxinhua
 *
 
*/

public   class  Shop  extends  Watchable  {

    
static  String IN  =   " in " ;     // 进入
     static  String OUT  =   " out " ;     // 出去
    
    Set
< String >  personSet  =   new  HashSet < String > ();
    
int  pcount  =   0 ;         // 店内总人数
    
    
/**
     * 来访登记
     * 
@param  name
     
*/

    
public   void  comeIn(String name) {
        personSet.add(name);
        pcount 
=  personSet.size();
        notifyWatchers(IN, name, pcount);    
// 通知观察者
    }

    
    
/**
     * 出店登记
     * 
@param  name 
     
*/

    
public   void  getOut(String name) {
        personSet.remove(name);
        pcount 
=  personSet.size();
        notifyWatchers(OUT, name, pcount);    
// 通知观察者
    }

    
}


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

package  simple.observer;

/**
 * 门卫(保安)类
 * 
@author  rongxinhua
 *
 
*/

public   class  Guard  implements  Watcher  {
    
    
private  String name;     // 门卫姓名

    
public  Guard() {}
    
    
public  Guard(String name) {
        
this .name  =  name;
    }

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

        
else   if (msg[ 0 ].equals( " out " )) {
            System.out.println(
this .name  +   " 向管理处汇报:“ "   +  msg[ 1 +   " ”已走出本店! " );
        }

    }

    

}

 

package  simple.observer;

/**
 * 摄像头类
 * 
@author  rongxinhua
 *
 
*/

public   class  Camera  implements  Watcher  {
    
    
private   int  id;         // 摄像头编号
    
    
public  Camera( int  id) {
        
this .id  =  id;
    }


    @Override
    
public   void  takeAction(Object  msg)  {
        System.out.println(
" 摄像头 "   +  id  +   " 号监测到现在店内总人数为 "   +  msg[ 2 +   " " );
    }


}


//测试类代码:

package  simple.observer;

public   class  Test02  {

    
/**
     * 
@param  args
     
*/

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


}


运行测试类,结果如下:

 1 门卫一号向管理处汇报:“BlogJava”已进入本店!
 2 摄像头1号监测到现在店内总人数为1人
 3 门卫一号向管理处汇报:“JavaEye”已进入本店!
 4 摄像头1号监测到现在店内总人数为2人
 5 门卫一号向管理处汇报:“BlogJava”已走出本店!
 6 摄像头1号监测到现在店内总人数为1人
 7 摄像头1号监测到现在店内总人数为2人
 8 摄像头1号监测到现在店内总人数为1人
 9 摄像头1号监测到现在店内总人数为2人
10 门卫二号向管理处汇报:“容新华”已进入本店!
11 摄像头1号监测到现在店内总人数为3人
12 门卫二号向管理处汇报:“CSDN”已走出本店!
13 摄像头1号监测到现在店内总人数为2人
分享到:
评论

相关推荐

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    观察者模式模版和例子

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的系统或者...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式例子,观察者模式,建造者模式

    在给定的压缩包文件中,"设计模式例子,观察者模式,建造者模式" 提到了两种重要的设计模式:观察者模式(Observer Pattern)和建造者模式(Builder Pattern)。下面我们将深入探讨这两种设计模式的概念、应用场景、...

    接口实现C#观察者模式简单例子

    在C#编程中,观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。这个模式广泛应用于事件驱动编程,例如GUI系统、多线程通信等...

    设计模式-观察者模式-作业-observer.zip

    观察者模式(Observer Pattern)是软件设计模式中的行为模式之一,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或发布-...

    委托实现C#观察者模式简单例子

    在C#编程中,观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个例子中,我们将通过使用委托来实现这一模式。委托在C#中...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    java 设计模式 观察者模式 简单实例 包括测试test类

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动或者发布...

    ObserverPattern.zip

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在这个例子中,李先生是观察者,他希望得到气象站的天气预报更新和旅行社的...

    Qt设计模式之观察者模式

    本篇文章将深入探讨Qt中的观察者模式(Observer Pattern),这是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心...

    java 观察者模式 demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于实现事件驱动的编程模型...

    观察者模式的例子(java)

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

    观察者模式Demo

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动编程,使得多...

    设计模式之Observer - 观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    [行为模式]head first 设计模式之观察者模式(observer)

    **观察者模式(Observer Pattern)**是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程或者...

    Observer Pattern.rar

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的系统...

    观察者模式的一个demo

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式常用于事件驱动编程,使得多个...

    观察者模式 c++ 实现

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C++中实现观察者模式,通常涉及以下几个关键概念: 1. **主题(Subject...

Global site tag (gtag.js) - Google Analytics