设计模式系列(1)---观察者模式解析与应用
来源:互联网 发布:阿里巴巴有淘宝客吗 编辑:程序博客网 时间:2024/06/01 08:13
在实际开发中,有时候会遇到多个不同类依赖某个目标类的情况,当目标类发生发生变化时,依赖目标类的其他类也要做出相应的调整,若要目标类和依赖类之间松耦合,则可以应用观察者模式。
1.什么是观察者模式
Head First设计模式是这样定义的:
观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监听一个主题对象。这样一来,当被观察者状态发生改变时,需要通知相应的观察者,使这些观察者对象能够自动更新。
2.观察者模式的应用场景
(1)当系统中一组依赖对象需要与他们所依赖的对象之间进行一致性同步交互时,比如用户注册完毕后,系统自动给用户发送一封邮件进行验证,“注册”和“发邮件”之间就是需要一致性同步交互的场景,这两者需要实现需要独立,不能耦合在一起。注册成功后就要系统自动发邮件。
(2)当一个对象的改变需要同时改变其他关联的对象,但又不知道具体有多少关联对象需要改变时也适用观察者模式。典型的应用就是发布–订阅模式。
3.观察者模式的优点与不足
(1)优点:使得观察者和被观察者之间松耦合,支持广播通信,被观察者会向所有的观察者发出通知消息
(2)不足:如果需要进行相互之间的观察,则有可能产生死循环。
4.Java对观察者模式的应用
Java中有观察者模式使用的API
- java.util.Observable 这是一个类,而非接口,主题需要继承这个类。
- java.util.Observer 这是一个接口,监听者需要实现这个接口
下面以注册后发邮件的场景为例,利用Java提供的API实现观察者模式的应用。
观察者类public class Email implements Observer { public void sendEmail() { System.out.println("系统成功向X用户发送了邮件"); } @Override public void update(Observable o, Object arg) { if (o instanceof UserInfo) { sendEmail(); } }}
//被观察者类public class UserInfo extends Observable { private Email email = null; public UserInfo() { email = new Email(); this.addObserver(email); } public void userRegister() { //...省去若干完成具体注册功能的实现 System.out.println("用户注册成功"); this.setChanged(); //设置变化点 notifyObservers(email); //当注册完成时通知观察者发送邮件 } public static void main(String[] args) { UserInfo userInfo = new UserInfo(); userInfo.userRegister(); }}
执行结果如下:
用户注册成功
系统成功向X用户发送了邮件
0 0
- 设计模式系列(1)---观察者模式解析与应用
- 设计模式系列(2)---单例模式解析与应用
- 设计模式系列:观察者模式
- 【设计模式系列】--观察者模式
- 观察者设计模式应用
- 设计模式-观察者模式应用
- [设计模式]-观察者模式应用
- 设计模式应用与发展之观察者模式(java)
- 设计模式初学者系列-观察者模式
- PHP设计模式系列 - 观察者模式
- 【大话设计模式系列】之观察者模式
- JAVA系列-设计模式-观察者模式
- Android设计模式系列--观察者模式
- Android设计模式系列--观察者模式
- Android设计模式系列--观察者模式
- Android设计模式系列--观察者模式
- Android设计模式系列--观察者模式
- Android设计模式系列--观察者模式
- Arrange an Array to Form a Smallest Digit
- Spark 学习视频汇总
- 【c/c++】delete和delete[]详解
- mysql 版本
- Win7系统怀疑重启
- 设计模式系列(1)---观察者模式解析与应用
- eclipse 一直loading org.hibernate.eclipse解决方法
- JS检测用户输入密码强度代码
- iOS开发项目中常用到的一些宏
- 安卓日记——preference用法简介
- 博客开通,AnyCai
- android 设置selector无效
- 【好书推荐】机器学习书单
- 用Hibernate实现领域对象的自定义字段