Oberver Define

Observer Patterns 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。

核心思想
发布-订阅机制:对象之间的解耦。
动态更新:观察者可以在运行时添加或移除。

结构

  • Subject(主题):维护观察者列表,提供注册和移除观察者的方法。
  • Observer(观察者):定义更新接口,当接收到通知时更新自身。
  • ConcreteSubject(具体主题):实现主题接口,通知状态改变。
  • ConcreteObserver(具体观察者):实现更新接口,响应主题的状态变化。

Example

先定义出主题接口,在实现主题类,主题类里面可以存储订阅者对象,当主题对象接收到新消息的时候,就遍历全部存储好的订阅者,遍历给他们发消息。

interface

// 定义主题接口  
public interface Subject {  
    void registerObserver(Observer observer);  
    void removeObserver(Observer observer);  
    void notifyObservers();  
}  
  
// 定义订阅者接口  
public interface Observer {  
    void update(String message);  
}  

Concrete

// 实现主题类  
public class ConcreteSubject implements Subject {  
    private List<Observer> observers;  
    private String state;  
  
    public ConcreteSubject() {  
        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() {  
        for (Observer observer : observers) {  
            observer.update(state);  
        }  
    }  
  
    public void setState(String state) {  
        this.state = state;  
        notifyObservers();  
    }  
}  
  
// 实现订阅者类  
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);  
    }  
}

client

public static void main(String[] args) {  
    ConcreteSubject subject = new ConcreteSubject();  
    ConcreteObserver observer1 = new ConcreteObserver("Observer 1");  
    ConcreteObserver observer2 = new ConcreteObserver("Observer 2");  
    subject.registerObserver(observer1);  
    subject.registerObserver(observer2);  
    subject.setState("Hello World!"); 
    // 输出:Observer 1 received message: Hello World!
    //      Observer 2 received message: Hello World!  
}

我们创建了一个具体的主题ConcreteSubject和一个具体的订阅者ConcreteObserver。
然后我们创建了两个订阅者并注册到主题。当状态改变时,主题会通知所有注册的订阅者。

posted on 2023-08-30 18:56  Mysticbinary  阅读(12)  评论(0编辑  收藏  举报