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

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

总结

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

相关推荐
wu~9703 小时前
手撕四种常用设计模式(工厂,策略,代理,单例)
java·单例模式·设计模式·代理模式·抽象工厂模式·策略模式
敲代码的 蜡笔小新10 小时前
【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀
unity·设计模式·c#·访问者模式
软考真题app1 天前
软件设计师考试结构型设计模式考点全解析
设计模式·软件设计师·结构型设计模式·考试考点
xiaolin03331 天前
【设计模式】- 行为型模式1
设计模式·状态模式·责任链模式·策略模式·命令模式·模板方法模式·行为型模式
沐土Arvin1 天前
深入理解 requestIdleCallback:浏览器空闲时段的性能优化利器
开发语言·前端·javascript·设计模式·html
bao_lanlan1 天前
兰亭妙微:用系统化思维重构智能座舱 UI 体验
ui·设计模式·信息可视化·人机交互·交互·ux·外观模式
总是难免1 天前
设计模式 - 单例模式 - Tips
java·单例模式·设计模式
Java致死2 天前
设计模式Java
java·开发语言·设计模式
ghost1432 天前
C#学习第23天:面向对象设计模式
开发语言·学习·设计模式·c#
敲代码的 蜡笔小新2 天前
【行为型之迭代器模式】游戏开发实战——Unity高效集合遍历与场景管理的架构精髓
unity·设计模式·c#·迭代器模式