一、观察者与被观察者
这个模式很好理解,又被称之为发布订阅。没错其实很多的中间件都有这个模式,例如Redis、MQ等等。
而在JAVA原生的API中又为我们提供了观察者和被观察者的类。所以我们实现起来就更容易了。先拿类图理解一下
记住四个角色:
1.被观察者(Subject)
2.具体被观察者(ConcreteSubject)
3.观察者(Observer)
4.具体观察者(ConcreteObserver)
其中观察者和被观察者已由JAVA原生API替我们实现,我们只需要关注他们的具体实现就好了。
二、实现
import java.util.Observable;
public class ConcreteObservable extends Observable{
public void A() {
System.out.println("ConcreteObservable A method...");
super.setChanged();
super.notifyObservers("hello,ConcreteObservable A method execute");
}
public void B() {
System.out.println("ConcreteObservable B method...");
super.setChanged();
super.notifyObservers("hello,ConcreteObservable B method execute");
}
}
/*----------------------分割线-------------------------------------------*/
public class ConcreteObserver implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("收到回执");
}
}
OK,以上。再来看看上层如何调用
public static void main(String[] args) {
ConcreteObservable h = new ConcreteObservable();
ConcreteObserver co = new ConcreteObserver();
h.addObserver(co);
h.A();
}
在以上例子中,我们使用了JAVA原生API的util包下的两个类
java.util.Observable;
java.util.Observer;
其实他们的实现很简单,那么我简单分享一个核心的逻辑。大家可以试着自己手写一下这两个类。
Observer(观察者类)
其实这个类我们看到了,就是我们实现类中实现的update方法,他会把被观察类和被观察类发送给我们的消息都回执给我们。
那我们要做的就是在update中处理自己的业务逻辑就好啦。
故此,它核心的就是一个回执方法(update)。
Observable(被观察者类)
记住核心点,不迷路:
1.被观察者类中有观察者类,但是我们可能只有一个观察者吗?对喽它可能有很多种,可以用集合来表示。
2.既然如此那一定有对观察者的CRUD操作的方法喽。
3.被观察者会给观察者回执信息,在这个回执信息的方法中要调起观察者的回执方法。
以上,分析完毕。
三、优缺点?
问题所在:
1.其实在刚才的例子中我们只有一个观察者的实现,如果有很多观察者再回执的时候如果一个观察者卡壳那么可能导致回执的时候需要很长时间。所以一般在调用回执的时候都是异步去处理。
2.另外需要注意广播链的问题,消息最多被转发一次。
优点:
很好发现,观察者模式的单一职责发挥的很好。所以它很容易可以实现一套链式操作。也就是触发机制,大家可以自己想一想。
提出疑问?
1.如果我们的被观察者很多,观察者只有一个的情况下。观察者的回执来不及响应呢?
2.我们所有的观察都需要被回执吗?让观察者自己决定吧。
以上,若有不足之处,欢迎指正!