$Java设计模式之——观察者模式(Observer)
2016-05-01 01:26
736 查看
(一)观察者模式简介
1、定义:定义对象间一种一对多的依赖关系,一个对象状态发生改变时,所有依赖它的对象都会接到通知并作出相应的响应。
2、应用场景:
(1)GUI系统
(2)订阅-发布系统
(3)事件多级触发场景
(4)当一个对象改变时需要通知其他对象,但不知道有其他对象具体有哪些时
3、UML类图
(二)观察者模式实例
1、假设有个珠宝公司要运送一批钻石,强盗也盯上这批钻石了,准备在运输途中抢劫,而珠宝公司雇佣的保镖要全程对钻石进行保护,警察也派出警车护航,关系如下图:
2、代码如下:
(1)抽象观察者接口:
(2)抽象被观察者接口:
(3)保镖类:
(4)警察类:
(5)强盗类:
(6)珠宝运输类:
(6)测试类:
(7)输出结果:
保镖收到消息:运输车队开始出发了。保镖开始保护!
收到消息:运输车队开始出发了。强盗准备动手!
警察收到消息:运输车队开始出发了。警察开始派警车护航!
保镖收到消息:运输车队摆脱了强盗。保镖开始保护!
警察收到消息:运输车队摆脱了强盗。警察开始派警车护航!
Refer:http://blog.csdn.net/jason0539/article/details/45055233
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
相关文章推荐
- 浅析JAVA_HOME,CLASSPATH和PATH的作用
- 【代码笔记】Java连连看项目的实现(2)——JTable 、TableModel的使用
- 20145122《Java程序设计》第九周学习总结
- JAVAMAIL SSL 和 NO-SSL 发送邮件
- Java—”继承“小知识点
- javax.mail发送邮件jsp页面
- Java多线程编程(二)操作状态与常用方法
- eclipse安装和maven的配置(windows)
- JAVA 泛型
- java.io.FileNotFoundException: class path resource [bean/test/User.hbm.xml] cannot be opened because it does not exist
- Java练习题
- Java编译器分析
- Spring JdbcTemplate方法详解
- Java泛型
- (Spring加载xml时)org.xml.sax.SAXParseException: cvc-elt.1: Cannot find the declaration of element 'beans'.
- readLine方法的简单练习,回答2016-04-27 的帖子的问题
- Java基础串理
- 学习Spring(九) -- Spring使用AOP
- 对象数组、集合、链表(java基础知识十五)
- springmvc请求url始终404错误