23种设计模式中的观察者模式

定义了一种一对多的依赖关系,当一个对象的状态发生改变时,其所有依赖者都会收到通知并自动更新。

观察者模式是一种发布-订阅模式。它让发送通知的一方(被观察者)和接收通知的一方(观察者)能够解耦,实现了对象之间的松耦合。

观察者模式的核心角色。

  1. Subject(主题/被观察者):维护观察者列表,提供添加、删除观察者的方法,以及通知观察者的方法。
  2. Observer(观察者):定义一个更新接口,用于在主题状态改变时接收通知。
  3. ConcreteSubject(具体主题):实现主题接口,存储具体状态,当状态改变时通知所有观察者。
  4. ConcreteObserver(具体观察者):实现观察者接口,维护一个指向具体主题的引用,存储与主题相关的状态。

下面是一个完整的观察者模式 Demo。

定义观察者接口。

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

定义主题接口。

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

实现具体主题。

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();

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

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

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    
    public void changeState(String newState) {
        System.out.println("Subject state changed to: " + newState);
        notifyObservers(newState);
    }
}

实现具体观察者。

java 复制代码
public class ConcreteObserver implements Observer {
    private String name;
    
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

执行测试代码,输出结果。

java 复制代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建主题
        ConcreteSubject subject = new ConcreteSubject();
        
        // 创建观察者
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");
        Observer observer3 = new ConcreteObserver("Observer 3");
        
        // 注册观察者
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.registerObserver(observer3);
        
        // 改变主题状态,观察者会收到通知
        subject.changeState("State 1");
        
        // 移除一个观察者
        subject.removeObserver(observer2);
        
        // 再次改变状态
        subject.changeState("State 2");
    }
}

可以看到,只要主题类发生变更,依赖于它的观察者都会收到通知并进行相应的更新。

总结

观察者模式。将主题和观察者解耦,实现了对象之间的松耦合。是一种一对多的通知机制,使得双方无需关心对方,只关心通知本身。

相关推荐
T___6 小时前
从入门到放弃?带你重新认识 Headless UI
前端·设计模式
葬送的代码人生6 小时前
AI Coding→像素飞机大冒险:一个让你又爱又恨的小游戏
javascript·设计模式·ai编程
渣渣_Maxz1 天前
使用 antlr 打造 Android 动态逻辑判断能力
android·设计模式
码农颜1 天前
java 设计模式_行为型_19命令模式
java·设计模式·命令模式
蔡蓝2 天前
设计模式-迭代器模式
设计模式·迭代器模式
梦想画家2 天前
数据管道架构设计指南:5大模式与最佳实践
设计模式·数据工程·数据编排
牛奶咖啡132 天前
学习设计模式《十三》——迭代器模式
设计模式·迭代器模式·内部迭代器和外部迭代器·带迭代策略的迭代器·双向迭代器·迭代器模式的优点·何时选用迭代器模式
哆啦A梦的口袋呀2 天前
设计模式汇总
python·设计模式
在未来等你2 天前
设计模式精讲 Day 1:单例模式(Singleton Pattern)
java·设计模式·面向对象·软件架构
不会编程的小江江2 天前
【设计模式】单例模式
单例模式·设计模式