$Java设计模式之——观察者模式(Observer)
(一)观察者模式简介
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
随机推荐
- error: memcached support requires ZLIB. Use --with-zlib-dir=<DIR> to specify the prefix where ZLIB
yum install zlib-devel
- 分布式服务框架 Zookeeper(四)官方编程指南
握草,是不是加了官方两个字就可以唬人了. 使用ZooKeeper开发分布式应用 简介 这篇文档是为了那些想利用ZooKeeper的协调服务来构建分布式应用的开发人员而写滴,不相干的走一边去哈.在这儿有 ...
- hdu 4272 LianLianKan 状态压缩
LianLianKan Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- python __new__ __init__ __del__
1.python实例化顺序是.__new__ -->__init__ --> __del__ 2.如果重写new没return,就实例化不成功
- python学习---简介
http://www.cnblogs.com/wuguanglei/p/3866583.html http://www.cnblogs.com/wuguanglei/p/3866583.html ok ...
- 设计模式之备忘录模式(Memento)
备忘录模式(Memento) 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. Originator(发起人):负责创建一个备忘录 ...
- Gradle5.x打jar包上传maven仓库
1.上传本地仓库 1.1 build.gradle 项目设置 plugins { id 'java' id 'maven' //引入maven插件 } group 'com.inkyi' //包名 v ...
- 【BZOJ2320】最多重复子串 调和级数+hash
[BZOJ2320]最多重复子串 Description 一个字符串P的重复数定义为最大的整数R,使得P可以分为R段连续且相同的子串.比方说,“ababab”的重复数为3,“ababa”的重复数为1. ...
- K-th Number(主席树)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 59327 Accepted: 20660 Ca ...
- mysql中对应oracle中的to_char()和to_number()函数
TO_CHAR(): CAST(123 AS CHAR(3)) TO_NUMBER(): cast( '123 ' as SIGNED INTEGER)