设计模式(11)观察者模式

一、概述:

1、定义:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

2、结构图:

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

public interface Observer {
    void update();
}

实现

复制代码
import java.util.ArrayList;
import java.util.List;
 
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private int state;
 
    public int getState() {
        return state;
    }
 
    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
 
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
 
    @Override
    public void unregisterObserver(Observer observer) {
        observers.remove(observer);
    }
 
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

public class ConcreteObserver implements Observer {
    private int observerState;
    private ConcreteSubject subject;
 
    public ConcreteObserver(ConcreteSubject subject) {
        this.subject = subject;
        this.subject.registerObserver(this);
    }
 
    @Override
    public void update() {
        observerState = subject.getState();
        System.out.println("Observer state updated: " + observerState);
    }
}

调用

复制代码
public class Main {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
 
        ConcreteObserver observer1 = new ConcreteObserver(subject);
        ConcreteObserver observer2 = new ConcreteObserver(subject);
 
        subject.setState(10);
        // 输出:
        // Observer state updated: 10
        // Observer state updated: 10
 
        subject.setState(20);
        // 输出:
        // Observer state updated: 20
        // Observer state updated: 20
 
        subject.unregisterObserver(observer2);
 
        subject.setState(30);
        // 输出:
        // Observer state updated: 30
    }
}
相关推荐
程序员JerrySUN39 分钟前
设计模式每日硬核训练 Day 14:组合模式(Composite Pattern)完整讲解与实战应用
设计模式·组合模式
碎梦归途1 小时前
23种设计模式-创建型模式之工厂方法模式(Java版本)
java·设计模式·工厂方法模式
XU磊2602 小时前
Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步
java·设计模式
匹马夕阳2 小时前
java开发中的设计模式之工厂模式
java·设计模式
Pasregret2 小时前
设计模式入门:从 GoF 分类到 SOLID 原则实战
java·设计模式
Light605 小时前
Python依赖注入完全指南:高效解耦、技术深析与实践落地
python·设计模式·单元测试·fastapi·依赖注入·解耦
都叫我大帅哥6 小时前
代码界的「俄罗斯套娃」:组合模式的嵌套艺术
java·后端·设计模式
渊渟岳8 小时前
为了掌握设计模式,开发了一款Markdown 文本编辑器软件(已开源)
java·设计模式
邪恶的贝利亚12 小时前
设计模式实践:模板方法、观察者与策略模式详解
设计模式·策略模式
匹马夕阳17 小时前
Java开发中的设计模式之观察者模式详细讲解
java·观察者模式·设计模式