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