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

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

对应的类图:

相关推荐
冷雨夜中漫步6 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
Gain_chance8 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
Gain_chance10 小时前
36-学习笔记尚硅谷数仓搭建-DWS层数据装载脚本
大数据·数据仓库·笔记·学习
肖永威10 小时前
macOS环境安装/卸载python实践笔记
笔记·python·macos
暗光之痕10 小时前
Unreal5研究笔记 Actor的生命周期函数
笔记·unreal engine
Gain_chance10 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
宵时待雨11 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
m0_7190841111 小时前
React笔记张天禹
前端·笔记·react.js
r i c k14 小时前
数据库系统学习笔记
数据库·笔记·学习
shandianchengzi15 小时前
【小白向】错位排列|图文解释公考常见题目错位排列的递推式Dn=(n-1)(Dn-2+Dn-1)推导方式
笔记·算法·公考·递推·排列·考公