观察者模式(代码简单介绍)

发布时间 2023-05-17 16:51:47作者: yifanglai

观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖者都会被通知并自动更新。在这个模式中,改变状态的对象被称为“主题”,依赖者被称为“观察者”。

当使用观察者模式时,同样有三个核心角色:主题(Subject)、观察者(Observer)和具体观察者(Concrete Observer)。

以下是使用Java实现观察者模式的示例:

import java.util.ArrayList;
import java.util.List;

// 主题接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具体主题类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;
    
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
    
    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }
}

 

// 观察者接口
interface Observer {
    void update(String state);
}

// 具体观察者类
class ConcreteObserver implements Observer {
    private String name;
    
    public ConcreteObserver(String name) {
        this.name = name;
    }
    
    public void update(String state) {
        System.out.println(name + " 收到更新,新状态为: " + state);
    }
}

// 示例
public class ObserverPatternExample {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        
        Observer observer1 = new ConcreteObserver("观察者1");
        Observer observer2 = new ConcreteObserver("观察者2");
        
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        
        subject.setState("状态更新1");
        // 输出:
        // 观察者1 收到更新,新状态为: 状态更新1
        // 观察者2 收到更新,新状态为: 状态更新1
        
        subject.removeObserver(observer2);
        
        subject.setState("状态更新2");
        // 输出:
        // 观察者1 收到更新,新状态为: 状态更新2
    }
}

在上面的示例中,Subject是一个主题接口,定义了注册观察者、移除观察者和通知观察者的方法。ConcreteSubject是一个具体主题类,实现了主题接口,并维护了观察者列表和状态信息。Observer是一个观察者接口,定义了接收更新的方法。ConcreteObserver是一个具体观察者类,实现了观察者接口,并在update方法中处理更新的逻辑。

这只是观察者模式的一个简单示例,实际应用中包含更多的复杂逻辑和更多的观察者与主题之间的交互。观察者模式可以根据实际需求进行扩展和定制。例如,在实际应用中,可以考虑以下改进和扩展:

  1. 异步通知:可以在主题中实现异步通知机制,以提高性能和响应性能。主题将通知放入消息队列或使用多线程机制异步处理通知,而不是在通知方法中同步调用观察者的更新方法。

  2. 观察者状态传递:观察者可以向主题提供自身的状态信息,以便主题能够根据观察者的状态进行适当的处理或决策。

  3. 多个主题:可以存在多个主题,观察者可以选择注册和订阅特定的主题。这样,观察者可以根据自己的兴趣和需求选择感兴趣的主题,并接收相应的更新通知。

  4. 取消订阅和动态注册:观察者可以随时取消订阅主题的通知,主题也可以允许动态注册新的观察者,以便在运行时进行动态的观察者管理。

  5. 观察者优先级:可以为观察者指定优先级,以确保在通知时按照优先级顺序进行更新。高优先级的观察者将首先接收到更新通知。

  6. 多线程安全:如果在多线程环境下使用观察者模式,需要考虑线程安全性,并使用同步机制或并发工具来确保多线程访问时的正确性。

以上只是一些改进和扩展的示例,实际应用中的观察者模式的设计和实现将根据具体的需求和场景而异。