当前位置: 首页 > article >正文

观察者模式

观察者模式

  • 观察者模式定义:
    • 使用场景
    • 角色定义
      • Subject 被观察者:
      • Observer 观察者:
      • ConcreteSubiect 具体的被观察者:
      • ConcreteObserver 具体的观察者:
    • 需求背景
      • 1. 抽象主题(Subject):
      • 2. 具体主题(ConcreteSubject):
      • 3. 抽象观察者(Observer):
      • 4. 具体观察者(ConcreteObserver):
      • 5. 使用示例:
      • 6. 示例分析:

观察者模式定义:

定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

使用场景

  1. 当一个对象的改变需要同时改变其他对象的时候,可以考虑使用观察者模式。例如,当一个订单状态改变时,需要同时更新库存和订单列表。

  2. 当一个对象需要通知其他对象,但又不希望知道其他对象的具体实现时,可以考虑使用观察者模式。例如,一个新闻发布者需要通知多个订阅者,但不知道每个订阅者具体的实现。

  3. 微信朋友圈动态通知、消息通知、广播通知、发布订阅等等

角色定义

Subject 被观察者:

定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察者必须实现的职责: 管理观察者并通知观察者。

Observer 观察者:

观察者接收到消息后,即进行 update (更新方法)操作对接收到的信息进行处理。

ConcreteSubiect 具体的被观察者:

定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

ConcreteObserver 具体的观察者:

每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑

需求背景

使用观察者模式实现一个某博主发布消息,关注他的人可以正常接收消息。

1. 抽象主题(Subject):

定义了被观察者的基本操作,包括添加、删除、通知观察者等。
public interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers(String message);
}

2. 具体主题(ConcreteSubject):

实现抽象主题接口,维护观察者列表,并在状态发生变化时通知观察者。
public class Blogger implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String message;

    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }

    public void postMessage(String message) {
        this.message = message;
        notifyObservers(message);
    }
}

3. 抽象观察者(Observer):

定义了观察者的基本操作,包括更新状态等。
public interface Observer {
    void update(String message);
}

4. 具体观察者(ConcreteObserver):

实现抽象观察者接口,保存观察者状态,并在被观察者状态发生变化时更新状态。
public class Follower implements Observer {
    private String name;

    public Follower(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " received new message: " + message);
    }
}

5. 使用示例:

public static void main(String[] args) {
        Blogger blogger = new Blogger();
        Observer follower1 = new Follower("Follower1");
        Observer follower2 = new Follower("Follower2");

        blogger.attach(follower1);
        blogger.attach(follower2);

        blogger.postMessage("New blog post!");

        blogger.detach(follower1);

        blogger.postMessage("Another blog post!");
    }

6. 示例分析:

在以上示例中,Blogger 充当了抽象主题角色,Follower 充当了抽象观察者角色,具体主题 Blogger 实现了 Subject 接口并维护观察者列表,具体观察者 Follower 实现了 Observer 接口并在被观察者状态发生变化时更新状态。在使用时,Blogger 发布了新的消息,通知所有关注他的人接收消息。同时,Follower 可以随时取消关注,不再接收博主的消息。


http://www.kler.cn/a/17725.html

相关文章:

  • 前端请求后端php接口跨域 cors问题
  • TortoiseSVN提示服务器凭证检核错误:站点名称不符
  • 智能电视/盒子的应用管理——通过ADB工具优化体验
  • 数据结构-集合
  • SciPy:Python 科学计算工具包的全面教程
  • 笔记 | image may have poor performance,or fail,if run via emulation
  • 爬虫实验笔记
  • Java面试题,吐血整理~
  • 【LeetCode】413. 等差数列划分
  • git合并分支(开发版本分支合并到发布版本分支)
  • JavaWeb:JavaScript 教程 笔记
  • 【系统集成项目管理工程师】计算题专题一
  • 3.13 结构体嵌套、大小及位域
  • Golang每日一练(leetDay0055) 最长子串、相交链表
  • Yuzuki Lizard V851S开发板 –编译 OPENCV 4.5.4
  • MySQL:常见运算符
  • FLstudio21支持中文语言及水果最新版本功能特点
  • C++之C++新特性
  • 借助PLC-Recorder,西门子PLC S7-200SMART实现2ms周期采集的方法(带时间戳采集)
  • C plus plus ——【继承与派生】
  • TouchGFX开发(2)----触摸屏幕组件点亮LED
  • 【Android入门到项目实战-- 8.5】—— 使用HTTP协议访问网络的实践用法
  • 命令设计模式
  • python基本数据类型---数字字符串
  • 有关教育的几段话
  • 基于zookeeper实现分布式锁