6.设计模式之观察者模式

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

前言

观察者模式定义了多个对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会收到通知并被自动更新。这种模式又称发布-订阅模式、模型-视图模式,是一种对象行为型模式

观察者模式中的四种角色:

  1. 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
  2. 具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
  3. 抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
  4. 具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

本节,我们就观察者模式展开详细介绍。

1. 定义观察者抽象接口

package com.wanlong.design_pattern.action.observer;

public interface Observer{
    //更新方法
    public void update(String msg);
}

2. 定义具体观察者

2.1 定义具体观察者1

package com.wanlong.design_pattern.action.observer;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/20 19:20
 */
public class ConcreteObserver implements Observer {

    @Override
    public void update(String msg) {
        System.out.println("观察者1收到消息:"+msg+".....开始发货");
    }
}

2.2 定义具体观察者2

package com.wanlong.design_pattern.action.observer;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/20 19:20
 */
public class ConcreteObserver2 implements Observer {

    @Override
    public void update(String msg) {
        System.out.println("观察者2收到消息:"+msg+".....开始对账");
    }
}

3. 定义抽象主题

package com.wanlong.design_pattern.action.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author wanlong
 * @version 1.0
 * @description: 抽象主题,维护观察者列表
 * @date 2022/9/20 19:19
 */

public abstract class Subject  {
    //定义一个观察者数组
    private List<Observer> obsList = new ArrayList<Observer>();

    //增加一个观察者
    public void addObserver(Observer obs) {
        this.obsList.add(obs);
    }

    //删除一个观察者
    public void delObserver(Observer obs) {
        this.obsList.remove(obs);
    }

    //通知所有观察者
    public void notifyObservers(String msg) {
        for (Observer obs : this.obsList) {
            obs.update(msg);
        }
    }
}

4. 定义具体主题

package com.wanlong.design_pattern.action.observer;

/**
 * @author wanlong
 * @version 1.0
 * @description: 具体业务主题,某一类业务主题,继承抽象主题
 * @date 2022/9/20 19:19
 */

public class ConcreteSubject extends Subject {
    //具体的业务
    public void doSomething(){
        /*
        do something 业务逻辑
       */
        String msg="付款了";
        //通知所有观察者付款了
        super.notifyObservers(msg);
    }
}

5. 客户端调用通知观察者

package com.wanlong.design_pattern.action.observer;
import org.junit.Test;

/**
 * @author wanlong
 * @version 1.0
 * @description:
 * @date 2022/9/20 19:22
 */
public class Client {

    @Test
    public void testObserver() {
        ConcreteSubject subject = new ConcreteSubject();
        //添加观察者,后续其他业务想监听消息,只需要维护新的观察者
        subject.addObserver(new ConcreteObserver());
        subject.addObserver(new ConcreteObserver2());
        //具体主题业务逻辑,在业务逻辑最后,通知观察者
        subject.doSomething();

    }
}
//观察者1收到消息:付款了.....开始发货
//观察者2收到消息:付款了.....开始对账

6. 总结

观察者模式主要用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象,Observer),令他们做出响应。解耦了观察者和目标之间的关系。

JAVASE提供了java.util.Observable和java.util.Observer来实现观察者模式

6.1 优缺点

6.1.1 优点

  1. 降低了目标与观察者间的耦合关系,两者间是松耦合的,符合依赖倒置原则。
  2. 目标与观察者间建立了一套触发机制。

6.1.2 缺点

  1. 目标与观察者间的依赖关系并没有完全解除,而且可能出现循环引用
  2. 当观察者对象很多时,通知的发布会花费较多的时间,影响程序的效率

6.2 使用场景

  1. 聊天室群发消息
  2. 邮件订阅
  3. Servlet中,监听器的实现
  4. 消息队列经典的观察者模式应用

以上,本人菜鸟一枚,如有问题,请不吝指正。文章来源地址https://www.toymoban.com/news/detail-439588.html

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

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

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

相关文章

  • 重温设计模式 --- 观察者模式

    观察者模式 是一种行为型设计模式,它允许对象之间建立一种一对多的关系,使得当一个对象状态改变时,所有依赖它的对象都能够自动得到通知并更新自己的状态。该模式可以帮助我们实现松耦合的系统,以便更好地应对变化和扩展。 在观察者模式中,有两个角色: 观察

    2024年02月13日
    浏览(59)
  • 设计模式(11)观察者模式

    一、概述: 1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 2、结构图: 实现  调用

    2024年02月11日
    浏览(53)
  • 设计模式——14. 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象之间的一对多依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够自动收到通知并更新自己的状态,以保持与被观察对象的同步。观察者模式也被称为发布-订阅模式。 观察者模式包含以

    2024年02月07日
    浏览(45)
  • 设计模式之观察者模式

    可以帮你的对象知悉现况,不会错过该对象感兴趣的事。对象甚至在运行时可决定是否要继续被通知。 从报纸和杂志的订阅说起: 报社的业务就是出版报纸 向某家报社订阅报纸,只要他们有新报纸出版,就会给你送来。只要你是他们的订户,你就会一直收到新报纸。 当你不

    2024年01月24日
    浏览(54)
  • 观察者设计模式

    行为型模式(Behavioral Patterns):这类模式主要关注对象之间的通信。它们 分别是: 职责链模式(Chain of Responsibility) 命令模式(Command) 解释器模式(Interpreter) 迭代器模式(Iterator) 中介者模式(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略

    2024年01月24日
    浏览(51)
  • 设计模式-观察者

    观察者模式是一种广泛应用于软件开发中的行为设计模式,尤其是在面向对象编程(OOP)中。该模式定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新 在观察者模式中,存在两个主要角色: 主题(Subject) 或 被

    2024年01月22日
    浏览(48)
  • 设计模式:行为型模式 - 观察者模式

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

    2023年04月22日
    浏览(97)
  • 设计模式之二:观察者模式

    假定我们需要为Weather-O-Rama公司建立一个气象站系统,除已有的WeatherData有数据源类,还需要更新三个布告板的显示:目前状况(温度、湿度、气压)、气象统计和天气预报。  1 以下是一个可能的实现 上述实现有以下问题存在: 针对具体实现编程,而非针对接口(currentCon

    2024年02月13日
    浏览(39)
  • 设计模式行为型——观察者模式

    目录 观察者模式的定义 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用         观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的

    2024年02月13日
    浏览(36)
  • 设计模式【行为型】-- 观察者模式

    观察者模式(Observer Pattern)是一种行为型设计模式,用于在对象之间建立一种一对多的依赖关系,使得当一个对象状态改变时,其相关依赖对象都能得到通知并自动更新。 主题( Subject ):也称为被观察者,它维护一个观察者列表,并提供添加、删除和通知观察者的方法。

    2024年02月15日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包