首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

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

2012-10-10 
观察者模式(Observer Pattern)的例子Java的API中有两组接口类是用来写观察者模式用的,分别是java.util.Obs

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

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人

热点排行