java观察者模式举例_写个观察者模式(Observer Pattern)的例子

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

clip_image002%5B13%5D_thumb.gif

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

//Watcher接口:

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * 观察者接口

d18c02628675d0a2c816449d98bda930.png *@authorrongxinhua

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicinterfaceWatcher9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * (接收到通知后,)观察者采取行动

d18c02628675d0a2c816449d98bda930.png     *@parammsg

ecedf933ec37d714bd4c2545da43add2.png*/d18c02628675d0a2c816449d98bda930.pngpublicvoidtakeAction(Object 

9b8a8a44dd1c74ae49c20a7cd451974e.png msg);

d18c02628675d0a2c816449d98bda930.png    

8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png

//Watchable类:

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.HashSet;

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.Set;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * "被观察对象" 的父类

d18c02628675d0a2c816449d98bda930.png *@authorrongxinhua

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassWatchable9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.pngprivateSetwatcherSet=newHashSet();

d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 通知观察者

d18c02628675d0a2c816449d98bda930.png     *@paramparams 通知的信息数组

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprotectedvoidnotifyWatchers(Object

9b8a8a44dd1c74ae49c20a7cd451974e.png params)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.giffor(Watcher watcher : watcherSet)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            watcher.takeAction(params);//观察者采取行动ecedf933ec37d714bd4c2545da43add2.png}ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 增加观察者

d18c02628675d0a2c816449d98bda930.png     *@paramwatcher

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprotectedvoidaddWatcher(Watcher watcher)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        watcherSet.add(watcher);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 移除观察者

d18c02628675d0a2c816449d98bda930.png     *@paramwatcher

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifprotectedvoidremoveWatcher(Watcher watcher)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        watcherSet.remove(watcher);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png    

8f1ba5b45633e9678d1db480c16cae3f.png}

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

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.HashSet;

4f1150b881333f12a311ae9ef34da474.pngimportjava.util.Set;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * 店类,可被观察的

d18c02628675d0a2c816449d98bda930.png *@authorrongxinhua

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassShopextendsWatchable9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.pngstaticString IN="in";//进入d18c02628675d0a2c816449d98bda930.pngstaticString OUT="out";//出去d18c02628675d0a2c816449d98bda930.pngd18c02628675d0a2c816449d98bda930.png    SetpersonSet=newHashSet();

d18c02628675d0a2c816449d98bda930.pngintpcount=0;//店内总人数d18c02628675d0a2c816449d98bda930.png97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 来访登记

d18c02628675d0a2c816449d98bda930.png     *@paramname

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidcomeIn(String name)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        personSet.add(name);

d18c02628675d0a2c816449d98bda930.png        pcount=personSet.size();

d18c02628675d0a2c816449d98bda930.png        notifyWatchers(IN, name, pcount);//通知观察者ecedf933ec37d714bd4c2545da43add2.png}d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     * 出店登记

d18c02628675d0a2c816449d98bda930.png     *@paramname 

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidgetOut(String name)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        personSet.remove(name);

d18c02628675d0a2c816449d98bda930.png        pcount=personSet.size();

d18c02628675d0a2c816449d98bda930.png        notifyWatchers(OUT, name, pcount);//通知观察者ecedf933ec37d714bd4c2545da43add2.png}d18c02628675d0a2c816449d98bda930.png    

8f1ba5b45633e9678d1db480c16cae3f.png}

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

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * 门卫(保安)类

d18c02628675d0a2c816449d98bda930.png *@authorrongxinhua

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassGuardimplementsWatcher9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.pngprivateString name;//门卫姓名d18c02628675d0a2c816449d98bda930.png97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicGuard()9b8a8a44dd1c74ae49c20a7cd451974e.png{}d18c02628675d0a2c816449d98bda930.png    

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicGuard(String name)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngthis.name=name;

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.png    @Override

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtakeAction(Object 

9b8a8a44dd1c74ae49c20a7cd451974e.png msg)9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(msg[0].equals("in"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            System.out.println(this.name+"向管理处汇报:“"+msg[1]+"”已进入本店!");

ecedf933ec37d714bd4c2545da43add2.png        }97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifelseif(msg[0].equals("out"))9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            System.out.println(this.name+"向管理处汇报:“"+msg[1]+"”已走出本店!");

ecedf933ec37d714bd4c2545da43add2.png        }ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif/** *//**d18c02628675d0a2c816449d98bda930.png * 摄像头类

d18c02628675d0a2c816449d98bda930.png *@authorrongxinhua

d18c02628675d0a2c816449d98bda930.png *

8f1ba5b45633e9678d1db480c16cae3f.png*/1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassCameraimplementsWatcher9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    

d18c02628675d0a2c816449d98bda930.pngprivateintid;//摄像头编号d18c02628675d0a2c816449d98bda930.png97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicCamera(intid)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngthis.id=id;

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png    @Override

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidtakeAction(Object

9b8a8a44dd1c74ae49c20a7cd451974e.png msg)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        System.out.println("摄像头"+id+"号监测到现在店内总人数为"+msg[2]+"人");

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

//测试类代码:

4f1150b881333f12a311ae9ef34da474.pngpackagesimple.observer;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassTest029b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif/** *//**d18c02628675d0a2c816449d98bda930.png     *@paramargs

ecedf933ec37d714bd4c2545da43add2.png*/97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicstaticvoidmain(String[] args)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        Shop shop=newShop();

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//添加摄像头1号d18c02628675d0a2c816449d98bda930.pngCamera camera=newCamera(1);

d18c02628675d0a2c816449d98bda930.png        shop.addWatcher(camera);

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//添加门卫一号d18c02628675d0a2c816449d98bda930.pngGuard guard1=newGuard("门卫一号");

d18c02628675d0a2c816449d98bda930.png        shop.addWatcher(guard1);

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//来访登记、出门登记d18c02628675d0a2c816449d98bda930.pngshop.comeIn("BlogJava");

d18c02628675d0a2c816449d98bda930.png        shop.comeIn("JavaEye");

d18c02628675d0a2c816449d98bda930.png        shop.getOut("BlogJava");

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//移除门卫一号,派他去做别的事d18c02628675d0a2c816449d98bda930.pngshop.removeWatcher(guard1);    

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//进入无人观察状态,随进随出d18c02628675d0a2c816449d98bda930.pngshop.comeIn("CSDN");

d18c02628675d0a2c816449d98bda930.png        shop.getOut("JavaEye");

d18c02628675d0a2c816449d98bda930.png        shop.comeIn("心梦帆影");

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//添加门卫二号d18c02628675d0a2c816449d98bda930.pngGuard guard2=newGuard("门卫二号");

d18c02628675d0a2c816449d98bda930.png        shop.addWatcher(guard2);

d18c02628675d0a2c816449d98bda930.png        

d18c02628675d0a2c816449d98bda930.png//来访登记,出门登记d18c02628675d0a2c816449d98bda930.pngshop.comeIn("容新华");

d18c02628675d0a2c816449d98bda930.png        shop.getOut("CSDN");

d18c02628675d0a2c816449d98bda930.png        

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

8f1ba5b45633e9678d1db480c16cae3f.png}

运行测试类,结果如下:

1

4f1150b881333f12a311ae9ef34da474.png门卫一号向管理处汇报:“BlogJava”已进入本店!24f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为1人34f1150b881333f12a311ae9ef34da474.png门卫一号向管理处汇报:“JavaEye”已进入本店!44f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为2人54f1150b881333f12a311ae9ef34da474.png门卫一号向管理处汇报:“BlogJava”已走出本店!64f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为1人74f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为2人84f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为1人94f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为2人104f1150b881333f12a311ae9ef34da474.png门卫二号向管理处汇报:“容新华”已进入本店!114f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为3人124f1150b881333f12a311ae9ef34da474.png门卫二号向管理处汇报:“CSDN”已走出本店!134f1150b881333f12a311ae9ef34da474.png摄像头1号监测到现在店内总人数为2人

本文原创,转载请注明出处,谢谢!http://www.blogjava.net/rongxh7(心梦帆影JavaEE技术博客)

posted on 2009-12-20 19:37 心梦帆影 阅读(2912) 评论(3)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值