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

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

对应的类图:

相关推荐
ZZHow102424 分钟前
JavaWeb开发_Day05
java·笔记·web
I'm a winner4 小时前
新手入门Makefile:FPGA项目实战教程(二)
笔记·fpga开发
我命由我123456 小时前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
long3166 小时前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
汤姆大聪明6 小时前
【软件设计模式】前置知识类图、七大原则(精简笔记版)
笔记·设计模式
lingggggaaaa8 小时前
小迪安全v2023学习笔记(六十一讲)—— 持续更新中
笔记·学习·安全·web安全·网络安全·反序列化
不太可爱的叶某人9 小时前
【学习笔记】Java并发编程的艺术——第6章 Java并发容器和框架
java·笔记·学习
超勇的阿杰10 小时前
gulimall项目笔记:P54三级分类拖拽功能实现
android·笔记
饕餮争锋10 小时前
设计模式笔记_行为型_策略模式
笔记·设计模式·策略模式