观察者模式

Posted by     "" on Tuesday, 2019年06月25日

[TOC]

一下文字来源:秦小波 《设计模式之禅》,这本设计模式书是太经典。

原理

相当于把观察者写入到了被观察者的那个类中。 然后在被观察者类里面调用观察者的接口就好了。

Subject被观察者

定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类 或者是实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者

Observer观察者

观察者接收到消息后,即进行update(更新方法)操作,对接收到的信息进行处理。

ConcreteSubject具体的被观察者

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

ConcreteObserver具体的观察者

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

观察者模式通用模式

被观察者

import java.util.Vector;

/**
 * 被观察者的职责非常简单,就是定义谁能够观察,谁不能观察
 */
public abstract class Subject {
    private Vector<Observer> observers = new Vector<Observer>();
    
    /**
     * 添加一个观察者
     * @param o
     */
    public void addObserver(Observer o) {
         observers.add(o);
    }

    /**
     * 删除一个观察者
     * @param o
     */
    public void delObserver(Observer o) {
        observers.remove(o);
    }

    /**
     * 通知所有观察者
     */
    public void notifyObservers() {
        for (Observer o : this.observers) {
              o.updateMessage();
        }
    }


}

具体被观察者

public class ConcreteSubject  extends Subject{

    public void doSomeThing() {
        System.out.println("被观察者:处理自己特有的业务");
        super.notifyObservers();
    }
    
}

观察者

public interface Observer {
    
    public void  updateMessage();

}

具体观察者

public class ConcreteObserver implements Observer {

    @Override
    public void updateMessage() {
        System.out.println("观察者:接受消息,并进行处理");
    }
}

测试代码

public class Client {
    
    public static void main(String[] args) {
        ConcreteSubject  subject = new ConcreteSubject();
        ConcreteObserver  observer = new ConcreteObserver();
        subject.addObserver(observer);
        subject.doSomeThing();
    }
}

运行结果

被观察者处理自己特有的业务
观察者接受消息并进行处理

注意

其中如果多个观察者在处理各自业务的时候,出现了阻塞的话,或者其中一个出现了错误,怎么办? 对于这种我们一般采用异步处理各自的业务代码,或者提前做好缓存的处理,防止消息链条的问题。

也可以理解这是一种 事件驱动模型

「真诚赞赏,手留余香」

真诚赞赏,手留余香

使用微信扫描二维码完成支付