设计模式之观察者模式 (Observer Design Pattern)

一、什么是观察者模式

观察者定义了一种一对多的依赖关系,当一个主题(Subject)对象状态发生变化时,所有依赖它的相关对象都会得到通知并且能够自动更新自己的状态,这些依赖的对象称之为观察者(Observer)对象这类似于发布/订阅模式。

观察者模式中的主题对象,会维持着一个依赖它的观察者对象列表,当主题对象状态发生改变时,主题对象便会调用这个列表中所有观察者对象的方法。

观察者模式一般用在分布式时间处理系统,它也是流行的MVC模型的核心设计模式。

二、观察者模式中的角色

观察者模式主要涉及到三个组件:Subject、Observer、ConcreteObserver

  • 主题(Subject):保存了所有观察者的引用,并供注册、删除观察者的接口,提供自己状态变化触发所有观察者更新的方法
  • 观察者(Observer):定义了更新自己状态的接口
  • 具体观察者( ConcreteObserver):具体实现观察者接口,使自己的状态和主题状态一致

三、代码实例

1. 主题对象类

import java.util.ArrayList;
import java.util.List;
public class Subject {
    //主题对象维持着一个依赖它的观察者对象列表
    private List<Observer> observers = new ArrayList<Observer>();
    //主题对象的状态
    private int state;
    //当主题对象状态变化时,调用所有观察者对象的方法
    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }
    //调用所有依赖它的观察者的方法
    public void notifyAllObservers(){
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
    //主题对象也可以注册、和删除依赖它的观察者对象
    public void attach(Observer observer){
        observers.add(observer);
    }

    public int getState() {
        return state;
    }
}

2. 观察者接口

public abstract class Observer {
    public abstract void update(int state);
}

3. 具体的观察者

public class ConcreteObserverA extends Observer{

    @Override
    public void update(int state) {
        System.out.println( "ConcreteObserverA get state change event: " + state );
    }
}
public class ConcreteObserverB extends Observer{

    @Override
    public void update(int state) {
        System.out.println( "ConcreteObserverA get state change event: " + state );
    }
}

最后写一个测试类测试一下

public class ObserverPatternDemo {
    public static void main(String[] args) {
        //初始化主题对象
        Subject subject = new Subject();
        //注册观察者对象到主题对象
        ConcreteObserverA ConcreteObserverA=new ConcreteObserverA();
        ConcreteObserverB ConcreteObserverB=new ConcreteObserverB();
        subject.attach(ConcreteObserverA);
        subject.attach(ConcreteObserverB);
        //主题对象状态发生变化
        subject.setState(20);

    }
}

我们看一下运行结果:

ConcreteObserverA get state change event: 20
ConcreteObserverA get state change event: 20

当主题对象状态发生改变,两个注册的观察者都收到了通知。

四、总结

其实观察者模式很简单,其核心内涵依然是用面向对象思想思考问题而非面向过程思想,面向接口编程,解耦合依赖。

但是观察者模式也有缺点,观察者模式是一种常用的链式触发机制,由于是链式触发,当观察者比较多的时候,性能问题是比较令人担忧的。并且,在链式结构中,比较容易出现循环引用的错误,造成系统假死。

时间: 2024-12-31 02:27:31

设计模式之观察者模式 (Observer Design Pattern)的相关文章

乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:webabcd 介绍 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例 有一个Message实体类,某些对象对它的操作有Insert()方法,当发生某些改变的时候,通知所有这些对象并执行Insert()方法. MessageModel using

【设计模式】—— 观察者模式Observer

模式意图 观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布--其他人接受. 这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化. 模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面.只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程. 这个模式代码相对来说比较容易理解,而且应用很广泛. 应用场景 1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的.就好比一个网站的有web端,也

PHP设计模式之观察者模式示例介绍

 这篇文章主要介绍了PHP设计模式之观察者模式(Observer)详细介绍和代码实例,需要的朋友可以参考下 [意图]   定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新[GOF95] 又称为发布-订阅(Publish-Subscribe)模式.模型-视图(Model-View)模式.源-监听(Source-Listener)模式.或从属者(Dependents)模式   [观察者模式结构图]       [观察者模式中主要角色]   1.抽

.NET设计模式:观察者模式(Observer Pattern)

意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新.[GOF <设计模式>] 结构图 图1 Observer模式结构图 生活中的例子 观察者定义了对象间一对多的关系,当一个对象的状态变化时,所有依赖它的对象都得到通知并且自动地更新.拍卖演示了这种模式.每个投标人都有一个标有数字的牌子用于出价.拍卖师开始拍卖时,他观察是否有牌子举起出价.每次接受一个新的出价都改变了拍卖的当前价格,并且广播给所有的投标人进行新的出价. 图2 使用拍卖例子

Java设计模式之观察者模式(Observer模式)介绍_java

Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广泛,遵循一定的编程模式,才能使自己的代码便于理解,易于交流,Observer(观察者)模式是比较常用的一个模式,尤其在界面设计中应用广泛,而本教程所关注的是Java在电子商务系统中应用,因此想从电子商务实例中分析Observer的应用. 虽然网上商店形式多样,每个站点有自己的特色,但也有其一般的共性,单就"

观察者模式(Observer Pattern) 详解

观察者模式(Observer Pattern): 定义了对象之间的一对多的依赖, 这样一来, 当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新. 使用方法: 1. 首先新建主题(subject)接口, 负责注册(register)\删除(remove)\通知(notify)观察者; 观察者(observer)接口, 负责更新(update)数据; 主题(subject)接口: 注册观察者(registerObserver), 删除观察者(removeObserver), 通知观察者(

设计模式 ( 十六 ) 观察者模式Observer(对象行为型)

设计模式 ( 十五 ) 观察者模式Observer(对象行为型)    1.概述 一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力.当对象们连接在一起时,它们就可以相互提供服务和信息. 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互相通信.但是出于各种原因,你也许并不愿意因为代码环境的改变而对代码做大的修改.也许,你只想根据你的具体应用环境而改进通信代码.或者,你只想简单的重新构造通信代码来避免类和类之间的相互依赖与相互从属. 2.问题 当一个对象的状态发生改变时,你

设计模式:观察者模式(observer)

设计模式:观察者模式(observer) 这种设计模式大量的使用,简单的说就是观察者通过被观察者来获得外界某种事物的状态 Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步. 如下图: image.png 被观察者(concreteSubject):其中必然包含了一个观察者的列表,用于状态发生变化的时候通过链表进行通知每个观察者做出相应的变化 观察者(ConcreteObserver):其中必然包含各种应对外界状态变化的方法,以供被观察者调用 图中

设计模式之观察者模式(Observable与Observer)

好久没有写博客啦,之前看完了<设计模式之禅>也没有总结一下,现在回忆一下设计模式之观察者模式. 1.什么是观察者模式 简单情形:有A.B.C.D等四个独立的对象,其中B.C.D这三个对象想在A对象发生改变的第一时间知道这种改变,以便做出相应的响应或者对策. 上面的这种情形,就是观察者模式. 当然可以有多个观察者,多个被观察者. 观察者与被观察者也不是对立的,一个对象可以观察其他对象,也可以被其他对象观察. 2.观察者模式的应用 为了更好的理解什么是观察者模式,下面我举一些可能用到该模式的情形或