(一)观察者模式简介

  1、定义:定义对象间一种一对多的依赖关系,一个对象状态发生改变时,所有依赖它的对象都会接到通知并作出相应的响应。

  2、应用场景:

  (1)GUI系统

  (2)订阅-发布系统

  (3)事件多级触发场景

  (4)当一个对象改变时需要通知其他对象,但不知道有其他对象具体有哪些时

  3、UML类图

  

  (二)观察者模式实例

  1、假设有个珠宝公司要运送一批钻石,强盗也盯上这批钻石了,准备在运输途中抢劫,而珠宝公司雇佣的保镖要全程对钻石进行保护,警察也派出警车护航,关系如下图:

  2、代码如下:

  (1)抽象观察者接口:

  1. /**
  2. * 抽象观察者
  3. *
  4. */
  5.  
  6. public interface Watcher {
  7. // 对被观察者状态变化做出响应的抽象方法
  8. public void update(String msg);
  9. }

  (2)抽象被观察者接口:

  1. /**
  2. * 抽象被观察者
  3. *
  4. */
  5.  
  6. public interface Watched {
  7. // 添加观察者
  8. public void addWatcher(Watcher watcher);
  9.  
  10. // 移除观察者
  11. public void removeWatcher(Watcher watcher);
  12.  
  13. // 通知观察者
  14. public void notifyWatchers(String msg);
  15. }

  (3)保镖类:

  1. /**
  2. * 保镖类,实现Watcher接口
  3. *
  4. */
  5.  
  6. public class Security implements Watcher {
  7.  
  8. @Override
  9. public void update(String msg) {
  10. System.out.println("保镖收到消息:" + msg + "。保镖开始保护!");
  11. }
  12.  
  13. }

  (4)警察类:

  1. /**
  2. * 警察类,实现Watcher接口
  3. *
  4. */
  5.  
  6. public class Police implements Watcher {
  7.  
  8. @Override
  9. public void update(String msg) {
  10. System.out.println("警察收到消息:" + msg + "。警察开始派警车护航!");
  11. }
  12.  
  13. }

  (5)强盗类:

  1. /**
  2. * 强盗类,实现Watcher接口
  3. *
  4. */
  5.  
  6. public class Thief implements Watcher {
  7.  
  8. @Override
  9. public void update(String msg) {
  10. System.out.println("收到消息:" + msg + "。强盗准备动手!");
  11. }
  12.  
  13. }

  (6)珠宝运输类:

  1. /**
  2. * 具体的被观察者
  3. *
  4. */
  5.  
  6. public class Transporter implements Watched {
  7.  
  8. List<Watcher> wathcerList = new ArrayList<Watcher>();
  9.  
  10. @Override
  11. public void addWatcher(Watcher watcher) {
  12. wathcerList.add(watcher);
  13. }
  14.  
  15. @Override
  16. public void removeWatcher(Watcher watcher) {
  17. wathcerList.remove(watcher);
  18. }
  19.  
  20. @Override
  21. public void notifyWatchers(String msg) {
  22. for (Watcher w : wathcerList) {
  23. w.update(msg);
  24. }
  25. }
  26.  
  27. }

  (6)测试类:

  1. public class Test {
  2. public static void main(String[] args) {
  3. Security s = new Security();
  4. Thief t = new Thief();
  5. Police p = new Police();
  6.  
  7. Transporter transPorter = new Transporter();
  8. transPorter.addWatcher(s);
  9. transPorter.addWatcher(t);
  10. transPorter.addWatcher(p);
  11.  
  12. transPorter.notifyWatchers("运输车队开始出发了");
  13.  
  14. transPorter.removeWatcher(t);
  15. transPorter.notifyWatchers("运输车队摆脱了强盗");
  16. }
  17. }

  (7)输出结果:

保镖收到消息:运输车队开始出发了。保镖开始保护!
收到消息:运输车队开始出发了。强盗准备动手!
警察收到消息:运输车队开始出发了。警察开始派警车护航!
保镖收到消息:运输车队摆脱了强盗。保镖开始保护!
警察收到消息:运输车队摆脱了强盗。警察开始派警车护航!

Refer:http://blog.csdn.net/jason0539/article/details/45055233

随机推荐

  1. error: memcached support requires ZLIB. Use --with-zlib-dir=<DIR> to specify the prefix where ZLIB

    yum install zlib-devel

  2. 分布式服务框架 Zookeeper(四)官方编程指南

    握草,是不是加了官方两个字就可以唬人了. 使用ZooKeeper开发分布式应用 简介 这篇文档是为了那些想利用ZooKeeper的协调服务来构建分布式应用的开发人员而写滴,不相干的走一边去哈.在这儿有 ...

  3. hdu 4272 LianLianKan 状态压缩

      LianLianKan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. python __new__ __init__ __del__

    1.python实例化顺序是.__new__ -->__init__ --> __del__ 2.如果重写new没return,就实例化不成功

  5. python学习---简介

    http://www.cnblogs.com/wuguanglei/p/3866583.html http://www.cnblogs.com/wuguanglei/p/3866583.html ok ...

  6. 设计模式之备忘录模式(Memento)

    备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...

  7. Gradle5.x打jar包上传maven仓库

    1.上传本地仓库 1.1 build.gradle 项目设置 plugins { id 'java' id 'maven' //引入maven插件 } group 'com.inkyi' //包名 v ...

  8. 【BZOJ2320】最多重复子串 调和级数+hash

    [BZOJ2320]最多重复子串 Description 一个字符串P的重复数定义为最大的整数R,使得P可以分为R段连续且相同的子串.比方说,“ababab”的重复数为3,“ababa”的重复数为1. ...

  9. K-th Number(主席树)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59327   Accepted: 20660 Ca ...

  10. mysql中对应oracle中的to_char()和to_number()函数

    TO_CHAR(): CAST(123   AS   CHAR(3)) TO_NUMBER(): cast( '123 '   as   SIGNED   INTEGER)