1 定义

在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会得到通知并自动更新。

2 主要角色

  1. Subject 被观察者

    能够动态地增加、 取消观察者。管理观察者并通知观察者。

  2. Observer观察者

    接收到消息后, 即进行update 操作, 对接收到的信息进行处理。

  3. ConcreteSubject具体的被观察者

    定义被观察者自己的业务逻辑, 同时定义对哪些事件进行通知。

  4. ConcreteObserver具体的观察者

    每个观察在接收到消息后的处理反应是不同, 各个观察者有自己的处理逻辑。

3 代码示例

Observer观察者

/**
 * 观察者
 */
public interface Observer {
    // 更新方法
    void update();
}

ConcreteObserver具体的观察者

/**
 * 具体观察者
 */
public class ConcreteObserver implements Observer{
    @Override
    public void update() {
        System.out.println("接受到信息,并进行处理");
    }
}

Subject 被观察者

/**
 * 被观察者
 */
public abstract class Subject {
    // 定义一个被观察者数组
    private List<Observer> obsList = new ArrayList<>();

    // 增加一个观察者
    public void addObserver(Observer observer){
        obsList.add(observer);
    }

    // 删除一个观察者
    public void delObserver(Observer observer){
        obsList.remove(observer);
    }

    // 通知所有观察者
    public void notifyObservers(){
        for (Observer observer : obsList){
            observer.update();
        }
    }
}

ConcreteSubject具体的被观察者

/**
 * 具体被观察者
 */
public class ConcreteSubject extends Subject{
    // 具体的业务
    public void doSomething(){
        super.notifyObservers();
    }
}

使用示例

public class ObserverClient {

    public static void main(String[] args) {
        // 创建一个被观察者
        ConcreteSubject subject = new ConcreteSubject();
        // 定义一个观察者
        Observer observer = new ConcreteObserver();
        // 观察者观察被观察者
        subject.addObserver(observer);
        subject.doSomething();
    }
}