前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式之观察者模式

设计模式之观察者模式

作者头像
用户2781897
发布于 2020-11-25 09:34:39
发布于 2020-11-25 09:34:39
35800
代码可运行
举报
文章被收录于专栏:服务端思维服务端思维
运行总次数:0
代码可运行

观察者设计模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。

当我们在打团队游戏时,当你受到攻击需要队友帮忙时该怎么办?

这时候就需要给你所有的队友发送一条你正在被攻击的消息。所有的队友会根据你发送的消息作出相应的动作。比如有团队意识来帮你,或者不帮你继续玩自己的。

这里面的队员就是该设计模式名字中的观察者。那么受到攻击的自己的是什么呢。被观察者?不,准确的我们称之为目标或者主题。

所以整个流程大概就是:当目标(主题)的状态发送改变时就会通知观察者,观察者根据自己的情况做出相应的动作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Observable;

/**
 * @Author gaotian
 * @Description 具体目标类 Subject 继承抽象类并实现通知观察者的方法
 * 它拥有自己的状态,当它的状态的改变时就会通知各个观察者。
 * @Date 9:01 2020/6/23
 **/
public class Subject extends Observable {

    /**
     * Observable 它是指被观察的对象。我们在主题中定义一个观察者集合。
     * 一个观察者对象可以接收任意多个观察者。同时提供了一系列的方法管理这些观察者。
     **/


    /**
     * @Author gaotian
     * @Description //开启改变状态
     * @Date 15:45 2020/6/23
     **/
    @Override
    protected synchronized void setChanged() {
        super.setChanged();
    }

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Observable;
import java.util.Observer;

/**
 * @Author gaotian
 * @Description
 * 具体观察者中会维护一个指向具体目标对象的引用,它存储了具体观察者的状态,这些状态和具体目标的状态要保持一致。
 *
 * 它实现了抽象观察者对象的updata方法。
 *
 * 通常在实现时,可以调用具体目标的attach和detach方法将自己加入到集合中或者从集合中剔除。
 * @Date 9:06 2020/6/23
 **/
public class ConcreteObserver implements Observer {

    private String observerName;

    public ConcreteObserver(String observerName) {
        this.observerName = observerName;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println(observerName + "我要更新一下我的状态了......");
        System.out.println("目标类为:" + o);
        System.out.println("参数为 = " + arg);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Observable;
import java.util.Observer;

/**
 * @Author gaotian
 * @Description 第二个具体的观察者,测试是否能够同时收到消息并更新状态
 * @Date 9:09 2020/6/23
 **/
public class ConcreteOberverOther implements Observer {

    private String observerName;

    public ConcreteOberverOther(String observerName) {
        this.observerName = observerName;
    }


    @Override
    public void update(Observable o, Object arg) {
        System.out.println(observerName + "我要更新一下我的状态了......");
        System.out.println("目标类为:" + o);
        System.out.println("参数为 = " + arg);
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import java.util.Observer;

public class NotifyMain {

    public static void main(String[] args) {

        Subject subject = new Subject();
        subject.setChanged();

        Observer observer = new ConcreteObserver("观察者一号");
        Observer observer2 = new ConcreteOberverOther("观察者二号");

        //将观察者都加入观察者列表中
        subject.addObserver(observer);
        subject.addObserver(observer2);

        //通知观察者
        boolean hasChanged = subject.hasChanged();
        System.out.println("hasChanged = " + hasChanged);

        subject.notifyObservers("123");

    }
    /**
     * 1.主要优点
     *
     * (1)观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息传递机制,并抽象了更新接口,使得可以有各种各样的表示层充当具体的观察者角色。
     *
     * (2)观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察者对象只需要维持一个抽象观察者的集合,无需了解其具体观察者。
     *
     * (3)观察者模式支持广播通信,观察目标会向所有已注册的观察者发送通知,降低了一对多系统的设计难度。
     *
     * (4)观察者模式满足开闭原则的要求,增加新的具体观察者无须修改原有的系统代码。
     *
     * 2.主要缺点
     *
     * (1)如果一个观察目标对象有很多的直接观察者和间接观察者,那么所有的观察者接收到消息会耗费大量的时间。
     *
     * (2)如果观察者和被观察者之间存在循环依赖,那么观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
     *
     * (3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道目标观察对象发生了变化。
     **/

}

1.主要优点 (1)观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息传递机制,并抽象了更新接口,使得可以有各种各样的表示层充当具体的观察者角色。 (2)观察者模式在观察目标和观察者之间建立一个抽象的耦合。观察者对象只需要维持一个抽象观察者的集合,无需了解其具体观察者。 (3)观察者模式支持广播通信,观察目标会向所有已注册的观察者发送通知,降低了一对多系统的设计难度。 (4)观察者模式满足开闭原则的要求,增加新的具体观察者无须修改原有的系统代码。 2.主要缺点 (1)如果一个观察目标对象有很多的直接观察者和间接观察者,那么所有的观察者接收到消息会耗费大量的时间。 (2)如果观察者和被观察者之间存在循环依赖,那么观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 (3)观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道目标观察对象发生了变化。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 服务端思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一起学设计模式 - 观察者模式
观察者模式是一种使用率极高的模式,用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。
battcn
2018/08/03
3560
一起学设计模式 - 观察者模式
【设计模式 10】观察者模式
观察者模式又叫发布订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时会通知所有观察者对象,使它们能够自动更新自己。
JuneBao
2022/10/26
3000
【设计模式 10】观察者模式
Java描述设计模式(11):观察者模式
该案例基于上述案例修改,观察者获取主题对象的消息话题,只有自己感兴趣的话题,才进一步获取内容。
知了一笑
2020/11/06
3540
Java描述设计模式(11):观察者模式
【Java设计模式】023-观察者模式
观察者(Observer)模式:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
訾博ZiBo
2025/01/06
530
Java观察者模式(Observer)
  观察者模式java GOF23种设计模式中的一种。在最近介绍的Redis和ActiveMQ中都涉及到了观察者模式,所以我们在本文详细介绍下此模式:
用户4919348
2019/04/02
8160
Java观察者模式(Observer)
Java设计模式之(十二)——观察者模式
观察者模式(Observer Design Pattern):在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。
IT可乐
2021/12/04
5.2K0
Java设计模式之(十二)——观察者模式
观察者模式
大家好,我是老田,今天我给大家分享设计模式中的观察者模式。用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式。
田维常
2021/07/15
7270
观察者模式:对象间的一种一对多的依赖关系
观察者模式[ 又称发布(publish)-订阅(Subscribe)模式 ],它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。其实就是一种通知机制,让发送通知的一方(被观察方)和接收通知的一方(观察者)能彼此分离,互不影响。UML类图如下:
BUG弄潮儿
2020/12/17
1.2K0
观察者模式:对象间的一种一对多的依赖关系
Java设计模式(十五)----观察者模式
观察者模式 一、定义 二、结构 具体案例 推模型和拉模型 三、Java提供的对观察者模式的支持 Observer接口 Observable类 一、定义 观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,
汤高
2018/01/11
9110
Java设计模式(十五)----观察者模式
观察者模式浅析
观察者模式是一种对象行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变的时候,所有依赖于它的对象都得到通知并被自动更新。观察者模式也叫发布-订阅模式(Publish-Subscribe)
孟君
2019/09/03
4400
观察者模式浅析
观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新。
noteless
2018/12/27
5980
java观察者模式
 像activeMQ等消息队列中,我们经常会使用发布订阅模式,但是你有没有想过,客户端时如何及时得到订阅的主题的信息?其实就里就用到了观察者模式。在软件系统中,当一个对象的行为依赖于另一个对象的状态时,观察者模式就相当有用。如果不使用观察者模式提供的通用结构,而需要我们实现类似的功能,想想我们该如何实现,我们只能在另外一个线程不断监听对象所依赖的状态。当然下面的例子都是基于一个进程内观察者模式的举例,你可能会和我当初一样不解,消息队列中的消费者是通过socket进行通信得到订阅的主题的信息。其实还是一回事的,被观察者(主题)里面会维护一个与它有订阅的所有消费者的连接,当被观察者(主题)里面添加一个消息时,就会调用自身的方法,把该消息通过维持的socket发送给所有订阅的消费者。
intsmaze-刘洋
2018/08/29
5400
java观察者模式
【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
观察者模式 : 定义了 对象之间 一对多 的 依赖 , 令 多个 观察者 对象 同时 监听 某一个 主题对象 , 当 主题对象 发生改变时 , 所有的 观察者 都会 收到通知 并更新 ;
韩曙亮
2023/03/29
5280
【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
设计模式:观察者模式
观察者模式属于行为型设计模式,用于建立对象间的一对多依赖关系。当主题(Subject)状态变化时,所有依赖的观察者(Observer)会自动收到通知并更新。
用户11531739
2025/03/11
1060
这就是观察者模式
观察者模式是软件设计模式中的一种,使用也比较普遍,尤其是在GUI编程中。关于设计模式的文章,网络上写的都比较多,而且很多文章写的也不错,虽然说有一种重复早轮子的嫌疑,但此轮子非彼轮子,侧重点不同,思路也不同,讲述方式也不近相同。
技术小黑屋
2018/09/05
8870
设计模式之观察者模式(二)
上一篇的观察者模式学习的还好吗?首先简单来回顾下上篇内容,有一个气象站的需求,需要在温度、湿度、气压改变的时候,实时更新三个布告板,以便能及时、准确的获取信息。所以,在设计模式的层面,我们最容易想到并且最正确的方式就是使用观察者模式来处理这个问题。
程序员小跃
2019/12/25
4650
设计模式(十八):行为型之观察者模式
Java微观世界
2025/01/21
1160
设计模式(十八):行为型之观察者模式
观察者模式
正值金三银四跳槽季,设计模式也是常问的问题之一。本人在3月2日的一次面试的二面中,问到设计模式,问到了观察者模式,而且要求写了伪代码。当时我脑子里就第一个想到的就是《大话设计模式》里面的一个例子,就是员工集体开小差,前台妹妹负责在老板回来时通知所有人。当时回答得结结巴巴,写得代码勉勉强强,惊喜的是二面过了。归,温习之。
mingmingcome
2021/11/29
4570
观察者模式
观察者模式是非常常用的设计模式_实现一个观察者模式
好久没有写博客啦,之前看完了《设计模式之禅》也没有总结一下,现在回忆一下设计模式之观察者模式。
全栈程序员站长
2022/09/20
2380
观察者模式是非常常用的设计模式_实现一个观察者模式
设计模式---观察者模式
微信公众号有服务号、订阅号和企业号之分。当我们在公众号上发布一篇博文推送时,订阅的用户都能够在我发布推送之后及时接收到推送,即可方便地在手机端进行阅读。
大忽悠爱学习
2021/11/15
2770
相关推荐
一起学设计模式 - 观察者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档