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

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!");
    }
}

对应的类图:

相关推荐
Ccjf酷儿27 分钟前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y1 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面1 小时前
(笔记)自定义 systemd 服务
笔记
DKPT3 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
佛祖让我来巡山3 小时前
设计模式深度解析:策略模式、责任链模式与模板模式
设计模式·责任链模式·策略模式·模版模式
QT 小鲜肉4 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
__万波__4 小时前
二十三种设计模式(三)--抽象工厂模式
java·设计模式·抽象工厂模式
转转技术团队4 小时前
VDOM 编年史
前端·设计模式·前端框架
星轨初途5 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
QT 小鲜肉5 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇深度解析与现代应用
笔记·读书·孙子兵法