设计模式19——观察者模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

观察者模式(Observer),又名:发布-订阅模式(publish-subscribe)

是一种行为型模式。因为叫发布-订阅模式更容易理解,所以下面说明时大多情况会使用发布-订阅这个名称。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:


一、概述

复制代码
1、观察者模式定义了一种一对多的依赖关系,让多个观察者(订阅者)对象同时监听某一个主题(发布者)对象。这个主题(发布者)对象在状态发生变化时,会通知所有观察者(订阅者)对象,使它们能够自动更新自己。

1.1、直观的理解

(注:关于发布者何时给订阅者通知更新,这个需要结合实际情况来考虑)

1.2、主要角色:

  • 发布者(目标主题):++发布者的抽象类或接口++ + ++发布者类++
  • 订阅者(观察者):++订阅者的抽象类或接口++ + ++订阅者类++

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 一个抽象模型有两个方面,其中一个方面依赖另一个方面。可以将它们封装独立出来
  • 对一个对象的改变需要同时改变其他对象
  • 一个对象必须通知其他对象,而且其他对象并不是固定不变的

二、简单举例

假设 客户端 要让 发布者 设置自己的状态为hello,再然后通知 张三 和 李四 这两个 订阅者 。例子简单就不再详细分析了。你可以把这当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图表示如下:

2.2、Java代码如下:

订阅者的抽象类:

java 复制代码
abstract class Subscriber {
    public abstract void update();//接收发布者的消息
}

发布者的抽象类:

java 复制代码
abstract class Publisher {
    private List<Subscriber> list; //链表

    public Publisher() {//初始化
        this.list = new LinkedList<>();
    }

    public void attach(Subscriber subscriber) { //增加订阅者
        list.add(subscriber);
    }

    public void detach(Subscriber subscriber) {//删除订阅者
        list.remove(subscriber);
    }

    public void notifySubscriber() {//通知订阅者
        for (Subscriber subscriber : list) {
            subscriber.update();
        }
    }

    private String publisherState;//发布者状态

    public String getPublisherState() {//得到发布者状态
        return this.publisherState;
    }

    public void setPublisherState(String publisherState) {//设置发布者状态
        this.publisherState = publisherState;
    }
}

具体的发布者A:

java 复制代码
public class ConcretePublisherA extends Publisher{
    //发布者的其它方法
}

具体的订阅者1:

java 复制代码
public class ConcreteSubscriber1 extends Subscriber {
    private String name;//订阅者名称
    private Publisher publisher;//发布者

    public ConcreteSubscriber1(String name, Publisher publisher) {//初始化
        this.name = name;
        this.publisher = publisher;
    }

    @Override
    public void update() {//接收发布者的消息
        System.out.println("订阅者是:" + this.name + ",发布者的状态为:" + this.publisher.getPublisherState());
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Publisher publisher = new ConcretePublisherA();
        Subscriber subscriber1 = new ConcreteSubscriber1("张三", publisher);
        Subscriber subscriber2 = new ConcreteSubscriber1("李四", publisher);
        publisher.attach(subscriber1);
        publisher.attach(subscriber2);
        publisher.setPublisherState("hello!");
        //通知订阅者
        publisher.notifySubscriber();
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
雨浓YN1 小时前
基于设计模式的Winform软件框架-01Xml\Log\Ini日志(单例模式+生产者消费者模式)
单例模式·设计模式
艾利克斯冰13 小时前
Java 设计模式-行为型模式(更新中)
java·开发语言·设计模式
星心源七境18 小时前
七境体系全解析:从六韬兵法到AI锁颜,一套贯穿古典智慧与现代应用的成长操作系统
人工智能·设计模式·设计
qq_2975746719 小时前
设计模式系列文章(基础篇第21篇):迭代器模式——遍历聚合解耦,实现统一迭代访问
设计模式·迭代器模式
禅思院1 天前
前端请求取消与调度完全指南:从 AbortController 到企业级优先级架构
前端·设计模式·前端框架
小bo波1 天前
用匿名内部类优雅地计算方法执行时间
java·设计模式·性能测试·模板方法模式·lambda·代码优化·匿名内部类
写代码的小阿帆1 天前
行为型设计模式之观察者(发布-订阅)模式
设计模式
王_teacher1 天前
23种设计模式全解析(GoF 设计模式)
设计模式·软考·软件设计师·软考中级
阿坤带你走近大数据1 天前
分别介绍下java主流的开发框架、设计模式与对应编程语言的高级特性
java·开发语言·设计模式
geovindu1 天前
go: Coroutines Pattern
开发语言·后端·设计模式·golang·协程模式