用户通常通过调用对象的方法来收集该对象的信息。但是当这个对象发生变化的时候,就会出现这样的一个问题:依赖该对象的用户如何才能知道对象的信息已经发生了变化?
我们可能通过这样一种设计:创建一个对象,每当用户所关心的对象某个方面发生变化的时候,该对象负责通知相关对此消息感兴趣的用户。这种设计的问题在于只有用户自己才知道他关心的某对象的哪些方面,因而这个受关注的对象不应当承担这种通知用户的责任。解决方法之一就是:在受关注的对象收到信息之后,通知用户,然后由用户去查询对象的新状态。
Observer模式的意图就是在多个对象之间定义一个一对多的关系,以便当一个对象状态改变的时候,其他所有依赖于这个对象的对象都能够得到通知,并被自动更新。
1.例子
JE上的订阅采用的就是这个观察者模式了,我们可以订阅我们所感兴趣的用户A。当用户A更新博客时,我们就可以随时收到并查看。这里就涉及到两个对象,一个是消息发布者(Noticer),还有一个就是消息接收者(Observer)
事情上JE上的每个用户ID既是消息发布者也是消息接收者,怎么说呢?
1.当用户A被一群人订阅时,那么它就是消息发布者,当他有写了新博客时,它就会通知所有订阅他的人,告诉他们我写了新博客了。
2.同样,用户A他也可能订阅订阅别人的博客,这个时候他就是消息接收者了
下面就写个简单的代码示之:
首先定义消息发布者接口(Notice)跟消息接收者接口(Observer)
-
-
-
-
-
- public interface Noticer {
-
- public void addObserver(Observer observer);
-
- public void removeObserver(Observer observer);
-
- public void notice(String message);
- }
-
-
-
-
-
- public interface Observer {
-
- public void update(String message);
- }
定义完接口之后,我们先来实现消息发布者接口(Noticer),其实现类NoticerImpl如下:
-
-
-
-
-
- public class NoticerImpl implements Noticer{
- private List<Observer> list = new ArrayList<Observer>();
-
- public void addObserver(Observer observer) {
- list.add(observer);
- }
-
- public void removeObserver(Observer observer) {
- list.remove(observer);
- }
-
- public void notice(String message) {
-
- for(Observer o:list){
- o.update(message);
- }
- }
-
- }
接着实现两个订阅者接口实现类分别为客户1,客户2:
- public class Customer1 implements Observer {
-
- public void update(String message) {
- System.out.println("Customer1 ACCEPT message:"+message);
- }
-
- }
-
-
-
- public class Customer2 implements Observer {
- public void update(String message) {
- System.out.println("Customer2 ACCEPT message:" + message);
- }
-
- }
最后我们做一下简单的代码测试:
- public class Test {
- public static void main(String[] args) {
-
- NoticerImpl impl = new NoticerImpl();
-
- Customer1 c1 = new Customer1();
- Customer2 c2 = new Customer2();
- impl.addObserver(c1);
- impl.addObserver(c2);
-
- impl.notice("Observer 模式要发布了!");
-
- }
- }
最后打印结果如下:
Customer1 ACCEPT message:Observer 模式要发布了!
Customer2 ACCEPT message:Observer 模式要发布了!
2.java的util包工具
java的util包中的Observable 其实就是观察者模式,它已经实现了相关的方法。
JDK
此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。
一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。
未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。
新创建一个 observable 对象时,其观察者集合是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。
分享到:
相关推荐
观察者模式Observer: 以手机号码为例,老师的手机号码存在学生的手机里,若老师的手机号改变,她会发一条短信通知每个学生自己手机号变了
Swift µframework 实现观察者模式Observer pattern
NULL 博文链接:https://hnzhoujunmei.iteye.com/blog/1033244
设计模式C++学习之观察者模式(Observer)
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
主要为大家详细介绍了Android使用观察者模式Observer实现网络状态监听,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
观察者模式 概述 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 适用性 1.当一个抽象模型有两个方面,其中一个方面依赖于另一方面。 将这二者封装...
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例 观察者模式示例
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
observer观察者模式
C#面向对象设计模式 (行为型模式) Observer 观察者模式 视频讲座下载
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
观察者(Observer)模式详解. 观察者(Observer)模式详解.
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...