返回

行为型设计模式之观察者模式

后端

设计模式的精髓在于,封装变化,隔离可变性。

设计模式主要解决的问题包括:创建型设计模式解决“对象的创建”问题,创建和使用代码解耦;结构型设计模式解决“类或对象的组合或组装”问题,将不同功能代码解耦;行为型设计模式则主要解决“对象的交互”问题,让对象之间可以相互通信和协调。

行为型设计模式有很多种,其中观察者模式是一种非常常见且实用的设计模式。观察者模式的核心思想是:当一个对象发生改变时,所有依赖它的对象都会收到通知并自动更新。这种模式可以帮助我们构建松耦合、易于扩展的系统。

观察者模式的结构

观察者模式主要由以下几个角色组成:

  • 被观察者(Subject) :被观察者是发生变化的对象,它负责通知所有观察者对象。
  • 观察者(Observer) :观察者是依赖于被观察者的对象,它负责接收被观察者发出的通知并做出相应的处理。
  • 具体被观察者(ConcreteSubject) :具体被观察者是实现了被观察者接口的具体类,它负责将自己的状态变化通知给所有观察者对象。
  • 具体观察者(ConcreteObserver) :具体观察者是实现了观察者接口的具体类,它负责接收具体被观察者的通知并做出相应的处理。

观察者模式的优点

观察者模式有很多优点,包括:

  • 松耦合 :观察者模式可以帮助我们构建松耦合的系统。被观察者和观察者对象之间是通过接口进行交互的,因此它们之间不需要知道对方的具体实现细节。这使得系统更加灵活和易于维护。
  • 可扩展性 :观察者模式很容易扩展。我们可以随时添加新的观察者对象,而不需要修改被观察者的代码。这使得系统很容易适应新的需求。
  • 可重用性 :观察者模式可以被重用于不同的系统中。这使得我们可以在不同的项目中重复利用相同的代码,从而提高开发效率。

观察者模式的应用场景

观察者模式可以用于多种场景,包括:

  • 事件驱动系统 :在事件驱动系统中,当一个事件发生时,系统会通知所有订阅该事件的观察者对象。观察者对象可以根据事件类型做出相应的处理。
  • 消息传递系统 :在消息传递系统中,当一条消息到达时,系统会通知所有订阅该消息的观察者对象。观察者对象可以根据消息内容做出相应的处理。
  • GUI系统 :在GUI系统中,当用户操作某个控件时,系统会通知所有订阅该控件的观察者对象。观察者对象可以根据控件的操作做出相应的处理。

观察者模式的示例

为了更好地理解观察者模式,我们来看一个简单的示例。假设我们有一个温度传感器,它可以测量室温并将其显示在屏幕上。当室温发生变化时,温度传感器会通知所有订阅它的观察者对象。

// 被观察者接口
interface TemperatureSensor {

    void addObserver(Observer observer);

    void removeObserver(Observer observer);

    void notifyObservers();

    double getTemperature();
}

// 具体被观察者类
class ConcreteTemperatureSensor implements TemperatureSensor {

    private List<Observer> observers = new ArrayList<>();

    private double temperature;

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

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

    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }

    @Override
    public double getTemperature() {
        return temperature;
    }

    public void setTemperature(double temperature) {
        this.temperature = temperature;
        notifyObservers();
    }
}

// 观察者接口
interface Observer {

    void update(TemperatureSensor temperatureSensor);
}

// 具体观察者类
class ConcreteObserverA implements Observer {

    @Override
    public void update(TemperatureSensor temperatureSensor) {
        System.out.println("Current temperature: " + temperatureSensor.getTemperature());
    }
}

// 具体观察者类
class ConcreteObserverB implements Observer {

    @Override
    public void update(TemperatureSensor temperatureSensor) {
        System.out.println("Temperature change: " + (temperatureSensor.getTemperature() - temperatureSensor.getTemperature()));
    }
}

// 测试
public class Main {

    public static void main(String[] args) {
        TemperatureSensor temperatureSensor = new ConcreteTemperatureSensor();

        Observer observerA = new ConcreteObserverA();
        Observer observerB = new ConcreteObserverB();

        temperatureSensor.addObserver(observerA);
        temperatureSensor.addObserver(observerB);

        temperatureSensor.setTemperature(20.0);
        temperatureSensor.setTemperature(25.0);
        temperatureSensor.setTemperature(30.0);
    }
}

在上面的示例中,温度传感器是一个被观察者对象,它负责通知所有观察者对象室温的变化。具体观察者类A负责显示室温,具体观察者类B负责显示室温的变化。当温度传感器检测到室温发生变化时,它会通知所有观察者对象,观察者对象根据室温的变化做出相应的处理。

总结

观察者模式是一种非常常见且实用的设计模式,它可以帮助我们构建松耦合、易于扩展的系统。观察者模式常用于构建事件驱动系统、消息传递系统和GUI系统。