(一)观察者模式简介

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

  2、应用场景:

  (1)GUI系统

  (2)订阅-发布系统

  (3)事件多级触发场景

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

  3、UML类图

  

  (二)观察者模式实例

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

  2、代码如下:

  (1)抽象观察者接口:

 /**
* 抽象观察者
*
*/ public interface Watcher {
// 对被观察者状态变化做出响应的抽象方法
public void update(String msg);
}

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

 /**
* 抽象被观察者
*
*/ public interface Watched {
// 添加观察者
public void addWatcher(Watcher watcher); // 移除观察者
public void removeWatcher(Watcher watcher); // 通知观察者
public void notifyWatchers(String msg);
}

  (3)保镖类:

 /**
* 保镖类,实现Watcher接口
*
*/ public class Security implements Watcher { @Override
public void update(String msg) {
System.out.println("保镖收到消息:" + msg + "。保镖开始保护!");
} }

  (4)警察类:

 /**
* 警察类,实现Watcher接口
*
*/ public class Police implements Watcher { @Override
public void update(String msg) {
System.out.println("警察收到消息:" + msg + "。警察开始派警车护航!");
} }

  (5)强盗类:

/**
* 强盗类,实现Watcher接口
*
*/ public class Thief implements Watcher { @Override
public void update(String msg) {
System.out.println("收到消息:" + msg + "。强盗准备动手!");
} }

  (6)珠宝运输类:

 /**
* 具体的被观察者
*
*/ public class Transporter implements Watched { List<Watcher> wathcerList = new ArrayList<Watcher>(); @Override
public void addWatcher(Watcher watcher) {
wathcerList.add(watcher);
} @Override
public void removeWatcher(Watcher watcher) {
wathcerList.remove(watcher);
} @Override
public void notifyWatchers(String msg) {
for (Watcher w : wathcerList) {
w.update(msg);
}
} }

  (6)测试类:

 public class Test {
public static void main(String[] args) {
Security s = new Security();
Thief t = new Thief();
Police p = new Police(); Transporter transPorter = new Transporter();
transPorter.addWatcher(s);
transPorter.addWatcher(t);
transPorter.addWatcher(p); transPorter.notifyWatchers("运输车队开始出发了"); transPorter.removeWatcher(t);
transPorter.notifyWatchers("运输车队摆脱了强盗");
}
}

  (7)输出结果:

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

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

最新文章

  1. xcode快捷方式 一 快速找到对应文件
  2. PAT (BL) 1001
  3. 推荐几款web站点JS(JQeury)图表(饼图,柱图,线图)
  4. HDU 4169 树形DP
  5. NSBundle介绍及使用
  6. Cisco 交换机的操作
  7. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)
  8. python selenium启动浏览器打开百度搜索
  9. Linux设置开机服务自动启动
  10. 从零开始学习前端开发 — 16、CSS3圆角与阴影
  11. Angular1.x使用小结
  12. Servlet之文件上传
  13. 利用Python进行数据分析——pandas入门
  14. 个人经验~ 利用5.7的sys库更好的排查问题
  15. 关于Idea模块化部署web项目,Web Resource Directories作用
  16. Android内存优化(三)详解内存分析工具MAT
  17. nodejs的process模块如何获取其他进程的pid
  18. tmux的复制粘贴
  19. linux screen 多任务后台执行
  20. oracle 12.2 linux/solaris正式发布

热门文章

  1. springboot开启事务管理
  2. eclipse 遇关键字enum编译问题解决
  3. android 细节之 AndroidRuntimeException:This message is already in use
  4. 枚举callback还是返回列表 ?
  5. 服务器之FRU
  6. shell编程实战总结
  7. 事务处理笔记《一》ADO.NET级别的事务
  8. hoj 2543 (费用流 拆边)
  9. 【BZOJ5056】OI游戏 最短路+有向图生成树计数
  10. 【BZOJ2213】[Poi2011]Difference DP