设计模式—观察者模式
2015-11-12 16:46
260 查看
观察者模式,又被称为发布-订阅模式、模型试图模式、源-收听者模式或者从属者模式。当然,怎么称呼这不重要。重要的是我们需要理解他的含义。
其主要作用就是,通过建立一个目标物体来管理所有依赖于它的观察者物件,并且在目标物件改变时,所有的观察者都能接收到通知。
在java中也就是,定义一个对象之间的一对多的依赖,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
借用鸿洋大神的例子,他举得是微信订阅号的例子,相当清楚地讲述了观察者模式的原理,我在这里只是归纳整理,进请见谅。奉上鸿洋大神传送门一个:/article/1380412.html
总体来说:
1.需要有一个主题(类似于订阅号),供观察者注册(类似于用户关注)
2.观察者(用户)如果想接收到主题(订阅号)的信息,就需要注册(关注)
3.当不需要接收信息时,则取消注册
4.观察者影响不了主题的行为
下面,来通过例子了解一下观察者模式的使用方法。
首先我们需要创建一个主题接口(订阅号需要实现该接口),和一个观察者接口(所有的用户都需要实现该接口)
创建主题接口:
创建观察者接口:
接下来,就是创建主题和观察者来实现着两个类了:
主题实现类:
观察者实现类:
这样 我们的观察者模式基本就实现了,剩下就是调用了。这里只是介绍观察者模式的基本实现原理,但是在java开发中,我们可以调用系统中自带的观察者模式。借助于java.util.Observable和java.util.Observer。
这个在鸿洋大神的例子里有,具体使用方法和上面讲述的大致一样,只是不需要我们自己再去写接口了而已。在此就不重复介绍了。
其主要作用就是,通过建立一个目标物体来管理所有依赖于它的观察者物件,并且在目标物件改变时,所有的观察者都能接收到通知。
在java中也就是,定义一个对象之间的一对多的依赖,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
借用鸿洋大神的例子,他举得是微信订阅号的例子,相当清楚地讲述了观察者模式的原理,我在这里只是归纳整理,进请见谅。奉上鸿洋大神传送门一个:/article/1380412.html
总体来说:
1.需要有一个主题(类似于订阅号),供观察者注册(类似于用户关注)
2.观察者(用户)如果想接收到主题(订阅号)的信息,就需要注册(关注)
3.当不需要接收信息时,则取消注册
4.观察者影响不了主题的行为
下面,来通过例子了解一下观察者模式的使用方法。
首先我们需要创建一个主题接口(订阅号需要实现该接口),和一个观察者接口(所有的用户都需要实现该接口)
创建主题接口:
/** * 主题接口,创建主题时必须实现该接口 * Created by 2 on 2015/11/13. */ public interface SubjectImp { /** * 注册一个观察着 * * @param observer */ void registerObserver(ObserverImp observer); /** * 移除一个观察者 * * @param observer */ void removeObserver(ObserverImp observer); /** * 通知所有的观察着 */ void notifyObservers(); }
创建观察者接口:
/** * 观察者接口,所有的观察者必须实现该接口 * Created by 2 on 2015/11/12. */ public interface ObserverImp { //在此处我们就让他实行信息更新的方法 void upDate(String string); }
接下来,就是创建主题和观察者来实现着两个类了:
主题实现类:
/** * 发布信息的主题实现类 * Created by 2 on 2015/11/13. */ public class SubjectMsg implements SubjectImp{ //创建一个集合来存放注册过的观察者 private List<ObserverImp> observers = new ArrayList<ObserverImp>(); private String msg; //消息信息 @Override public void registerObserver(ObserverImp observer) { observers.add(observer); } @Override public void removeObserver(ObserverImp observer) { int index = observers.indexOf(observer); if (index >= 0) //防止空指针 { observers.remove(index); } } @Override public void notifyObservers() { for (ObserverImp observer : observers) { observer.upDate(msg); } } /** * 通过此方法,设置主题要更新的消息 * * @param msg */ public void setMsg(String msg) { this.msg = msg; notifyObservers(); } }
观察者实现类:
/** * 观察者1号 * Created by 2 on 2015/11/13. */ public class Observer1 implements ObserverImp{ private SubjectImp subject; /** * 在构造方法中传入主题来注册该观察者 * @param subject */ public Observer1(SubjectImp subject) { this.subject = subject; subject.registerObserver(this); } @Override public void upDate(String string) { System.out.println("我是观察着1号,我收到的信息是" + string ); } }
/** * 观察者2号 * Created by 2 on 2015/11/13. */ public class Observer2 implements ObserverImp{ private SubjectImp subject; /** * 在构造方法中传入主题来注册该观察者 * @param subject */ public Observer2(SubjectImp subject) { this.subject = subject; subject.registerObserver(this); } @Override public void upDate(String string) { System.out.println("我是观察着2号,我收到的信息是" + string ); } }
这样 我们的观察者模式基本就实现了,剩下就是调用了。这里只是介绍观察者模式的基本实现原理,但是在java开发中,我们可以调用系统中自带的观察者模式。借助于java.util.Observable和java.util.Observer。
这个在鸿洋大神的例子里有,具体使用方法和上面讲述的大致一样,只是不需要我们自己再去写接口了而已。在此就不重复介绍了。
相关文章推荐
- 杭电OJ 1004实现和一些注意的陷阱
- UIScrollView上面添加的控件偏移
- 敏捷开发之Scrum扫盲篇
- 动态数组ArrayList
- springsecurity中如何做到多个用户不能使用同一个账号同时登陆系统
- SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3:
- Android Studio使用过程中常见问题及解决方案
- Android String 资源 你所不知道的
- 将.frm、.myd和.myi文件导入mysql数据库中
- Spring MVC多图片上传,多值上传
- easyui获取时间出错
- 实现加大UIButton/UITextField 的点击范围
- 几个卫星导航系统官方网站的链接
- 事务的传播特性和隔离级别理解
- 将十六进制转换为十进制
- Android开发在路上:少去踩坑,多走捷径(下)
- 支持课11周-if语句
- PHP—— 生成器 (generator)和协程的实现
- Java篇:编写安全可靠程序的75条建议
- Codeforces Round #311 (Div. 2) D - Vitaly and Cycle(二分图染色应用)