设计模式笔记_行为型_观察者模式

1. 观察者模式介绍

观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,使得多个观察者对象可以监听一个主题对象。当主题对象的状态发生变化时,所有依赖于它的观察者都会收到通知并更新。

**优势:**观察者模式使得对象之间的耦合性降低,主题与观察者之间的关系是松耦合的,有助于提高系统的可维护性和扩展性。

**类比:**可以将观察者模式类比为社交媒体上的关注功能。假设你在某个社交平台上关注了一位博主,当这位博主发布新内容时,你会收到通知。这种机制类似于观察者模式:博主是主题,关注者是观察者,博主发布新内容(状态变化)时,所有关注者都会收到通知(更新)。

关键组成部分:

  1. 主题(Subject):拥有状态的对象,维护一个观察者列表,并定义方法来添加、删除和通知观察者。
  2. 观察者(Observer):观察主题对象的状态变化,并在收到通知时进行更新。
  3. 具体主题(Concrete Subject):实现主题接口,并在状态变化时通知所有观察者。
  4. 具体观察者(Concrete Observer):实现观察者接口,定义更新方法以响应主题的状态变化。

应用场景:

  • GUI事件处理:按钮点击后通知注册的监听器。
  • 数据模型与视图同步:当数据变化时,视图自动更新。
  • 消息订阅系统:订阅者接收发布者的消息更新。

2. 代码演示

**演示场景:**多位用户(Follower) 关注一位博主(Blog),当博主发了新博客后,其关注者都能收到更新消息。这里的博主属于主题Subject,用户们属于观察者Observer,是一对多的关系。

观察者接口(Observer):

java 复制代码
public interface Observer {
    void update(String message);
}

主题接口(Observer)

java 复制代码
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

具体主题(Concrete Subject)

java 复制代码
public class Blog implements Subject {
    //维护一个观察者列表
    private final List<Observer> observers = new ArrayList<>();
    //最新博客信息
    private String latestPost;

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

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

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

    public void postNewBlog(String blog) {
        this.latestPost = blog;
        notifyObservers();
    }
}

具体观察者(Concrete Observer)

java 复制代码
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 update: " + message);
    }
}

客户端使用演示

java 复制代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        Blog techBlog = new Blog();

        Observer alice = new Follower("Alice");
        Observer bob = new Follower("Bob");

        techBlog.registerObserver(alice);
        techBlog.registerObserver(bob);

        techBlog.postNewBlog("New Java Features Released!");
    }
}

对应的类图:

相关推荐
Suckerbin1 小时前
DarkHole: 2靶场渗透
笔记·安全·web安全·网络安全
一枝小雨1 小时前
【C++】Vector完全指南:动态数组高效使用
开发语言·c++·笔记·vector·学习笔记·std库
大白的编程日记.2 小时前
【Linux学习笔记】信号的深入理解之软件条件产生信号
linux·笔记·学习
Wilber的技术分享2 小时前
【大模型实战笔记 1】Prompt-Tuning方法
人工智能·笔记·机器学习·大模型·llm·prompt
来生硬件工程师2 小时前
【硬件笔记】负载是如何烧MOS的?
笔记·嵌入式硬件·硬件架构·硬件工程·硬件设计
lingggggaaaa4 小时前
小迪安全v2023学习笔记(七十八讲)—— 数据库安全&Redis&CouchDB&H2database&未授权&CVE
redis·笔记·学习·算法·安全·网络安全·couchdb
Source.Liu4 小时前
【Python基础】 13 Rust 与 Python 注释对比笔记
开发语言·笔记·python·rust
诗句藏于尽头4 小时前
DJANGO后端服务启动报错及解决
数据库·笔记·django
汇能感知5 小时前
光谱相机的探测器类型
经验分享·笔记·科技
xiaowu0805 小时前
观察者模式-红绿灯案例
观察者模式