java设计模式(二十)观察者模式

这篇具有很好参考价值的文章主要介绍了java设计模式(二十)观察者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

定义

观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

模式结构

java设计模式(二十)观察者模式

角色职责

1.抽象目标类(Subject):它用一个列表记录当前目标对象有哪些观察者对象,并提供增加、删除观察者对象和通知观察者对象的接口。
2.具体目标类(ConcreteSubject):一个目标对象就是某个具体目标类的对象,一个具体目标类负责定义它自身的事务逻辑,并在状态改变时通知它的所有观察者对象。
3.抽象观察者类(Observer):它为所有的观察者对象都定义了一个名为update的方法(也叫成员函数)。当目标对象的状态改变时,它就是通过调用它的所有观察者对象的update方法来通知它们的。
4.具体观察者类(ConcreteObserver):每个具体观察者类都要重定义Observer类中定义的update方法,在该方法中实现它自己的任务逻辑,当它被通知的时候(目标对象调用它的update方法)就执行自己特有的任务。

代码实现

抽象目标类:

public abstract class Subject {
    private LinkedList<MyObserver> observers = new LinkedList<MyObserver>();

    public void attachObserver(MyObserver obs) {
        observers.add(obs);
    }

    public void detachObserver(MyObserver obs){
        observers.remove(obs);
    }
    //通知所有的观察者对象
    public void notifyObservers() {
        for (MyObserver obs : observers) {
            obs.update((this));
        }
    }
}

具体目标类:

public class Weather extends Subject {
    private float temp;

    public Weather() {
        this.temp = -1000;
    }

    public float getTemperature() {
        return this.temp;
    }

    public void fetchWeatherData() {
        float max = 60;
        float min = -80;
        float newTemp = (float) (Math.random() * (max - min) + min);

        if (newTemp != this.temp) {
            this.temp = newTemp;
            notifyObservers();
        }
    }
}

抽象观察者:

public interface MyObserver {
    public void update(Subject subject);
}

具体观察者:

public class CelsiusView implements MyObserver {
    @Override
    public void update(Subject subject) {
        if (subject instanceof Weather) {
            Weather weather = (Weather) subject;
            float temperature = weather.getTemperature();
            System.out.println("摄氏温度View:" + temperature);
        }
    }
}


public class WearView implements MyObserver {
    @Override
    public void update(Subject subject) {
        if (subject instanceof Weather) {
            Weather weather = (Weather) subject;
            float temperature = weather.getTemperature();
            if (temperature < 10) {
                System.out.println("穿衣服建议View:十分寒冷,请穿羽绒服。");
            }else if(temperature < 20){
                System.out.println("穿衣服建议View:比较凉爽,多穿点。");
            } else if (temperature < 30) {
                System.out.println("穿衣服建议View:比较温暖,可以穿薄点。");
            } else {
                System.out.println("穿衣服建议View:非常炎热,少穿点。");
            }
        }
    }
}

测试结果:

public class App {
    public static void main(String[] args) {
        Weather weather = new Weather();

        //创建两个观察者对象
        CelsiusView celsiusView = new CelsiusView();
        WearView wearView = new WearView();

        weather.attachObserver(celsiusView);
        weather.attachObserver(wearView);

        weather.fetchWeatherData();
        System.out.println("\n");

        weather.fetchWeatherData();
    }
}

摄氏温度View:14.774444
穿衣服建议View:比较凉爽,多穿点。


摄氏温度View:-64.72526
穿衣服建议View:十分寒冷,请穿羽绒服。

适用场景

1、当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
2、当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

优缺点

优点:
1、易于扩展:一个观察目标可以对应多个观察者,而这些观察者之间没有相互联系,所以能够根据需要增加和删除观察者,使得系统更易于扩展,符合开闭原则;
2、松耦合,虽然彼此不清楚对方的细节,但依然可以交互,目标对象只知道一个具体的观察者列表,但并不认识任何一个具体的观察者,它只知道他们都有一个共同的接口。
缺点:
1、耗时:如果存在很多个被观察者的话,那么将需要花费一定时间通知所有的观察者。
2、如果观察者与被观察者之间存在循环依赖的话,那么可能导致系统崩溃,并且观察者模式没有相应的机制让观察者知道被观察对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
java设计模式(二十)观察者模式文章来源地址https://www.toymoban.com/news/detail-473978.html

到了这里,关于java设计模式(二十)观察者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java设计模式-观察者模式

    观察者模式(Observer)是软件设计中的一种行为模式。 它定义了对象之间的一对多关系,其中如果一个对象改变了状态,所有依赖它的对象都会自动被通知并更新。 这种模式包含了两种主要的角色,即被观察者(Subject)和观察者(Observer)。 被观察者维护了一个观察者列表

    2024年02月15日
    浏览(29)
  • Java观察者设计模式

    观察者模式,定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在Java中,观察者模式通常由两个接口组成:Subject和Observer。Subject是被观察的对象,Observer是观察者。Subject接口定义了一系列方法,用于添加、删

    2024年02月16日
    浏览(27)
  • java设计模式学习之【观察者模式】

    想象你在一个在线拍卖会上竞标一件珍贵的艺术品。每当有人出价更高,系统都会立即通知你。这个实时更新机制使你可以做出快速反应。这种模式,在软件开发中称为观察者模式,是一种广泛应用于实现事件驱动系统的设计模式。 观察者模式(Observer Pattern)是一种行为型

    2024年02月03日
    浏览(29)
  • Java设计模式-观察者模式-SpringBoot实现

    项目:https://gitee.com/KakarottoChen/blog-code.git 的:JavaSpringListener Java观察者模式是一种设计模式,用于实现对象之间的一对多依赖关系。在观察者模式中,当一个对象的状态发生变化时,它的所有依赖对象(观察者)都会自动收到通知并进行相应的更新。 观察者模式由以下几个核

    2024年02月08日
    浏览(26)
  • java设计模式-观察者模式(jdk内置)

    上一篇我们学习了 观察者模式。 观察者和被观察者接口都是我们自己定义的,整个设计模式我们从无到有都是自己设计的,其实,java已经内置了这个设计模式,我们只需要定义实现类即可。 下面我们不多说明,直接示例代码,例子依然同 观察者模式篇章,建议先去看看。

    2024年02月15日
    浏览(28)
  • Java设计模式系列--观察者模式写法2:JDK

    原文网址:Java设计模式系列--观察者模式写法2:JDK_IT利刃出鞘的博客-CSDN博客 说明 本文用示例介绍观察者模式的一种写法:JDK。 JDK的观察者模式简介 在 Java 中,java.util.Observable 类和 java.util.Observer 接口定义了观察者模式,只要实现这两个接口就可以编写观察者模式。 1. Ob

    2024年02月13日
    浏览(33)
  • 二十四种设计模式与六大设计原则(三):【装饰模式、迭代器模式、组合模式、观察者模式、责任链模式、访问者模式】的定义、举例说明、核心思想、适用场景和优缺点

    接上次博客:二十四种设计模式与六大设计原则(二):【门面模式、适配器模式、模板方法模式、建造者模式、桥梁模式、命令模式】的定义、举例说明、核心思想、适用场景和优缺点-CSDN博客 目录 装饰模式【Decorator Pattern】 定义 举例说明 核心思想 适用场景 优缺点 迭代

    2024年04月17日
    浏览(44)
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    有一个天气预报项目,需求如下: 气象站可以将每天测量到的温度、湿度、气压等等以公告的形式发布出去(比如发布到自己的网站或第三方) 需要设计开放型API,便于其他第三方也能接入气象站获取数据 提供温度、气压、湿度的接口 测量数据更新时,要能实时的通知给第三

    2024年02月14日
    浏览(29)
  • 设计模式:观察者模式

    定义 观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。 应用场景 观察者模式适用于以下场景: 联动反应 :当一个对象

    2024年04月08日
    浏览(44)
  • 【设计模式】观察者模式

    观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。 Subject:抽象主题(被观察者

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包