版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengyu6623/article/details/87561481
什么是观察者模式
观察者模式又可以说成是发布订阅模式,字面理解就是被观察者触发动作通知到所有观察者。类比于群主在QQ群里发个消息,所有在群里的成员都能收到消息。
为什么要使用观察者模式
我们知道具体的对象负责它所管辖的范围内的功能,但是需求的实现往往需要多个关系有因果的发生,简单的来说就是事件B的发生时因为事件A的触发。
模拟这样一个场景,假如你开了一家工厂A,者工厂干啥的呢,做衣服。你时不时的接到一些订单,这天又接到一个订单,大单,加工一批衣服。然后你这个工厂A就调用加工衣服的功能吧。可是很不幸的是你没得员工。
这个时候工厂A就得招工人了,然后你一声令下,然后就该干嘛干嘛。工人就开干了,生产经营蒸蒸日上。
这里可以看到工厂就类比于被观察者,工人就是观察者,时刻观察着老板。
这样工厂就可以往里加员工,同时也可以解雇员工,使其不再能监听的工厂的消息任务。
所以观察者模式也就更多的处理这种需要解耦并有因果的逻辑关系。
观察者模式组成
被观察者
public abstract class Subject {
private Vector<Observer> observers = new Vector<>();
//增加观察者
public void addObserver(Observer o){
this.observers.add(o);
}
//移除观察者
public void removeObserver(Observer o){
this.observers.remove(o);
}
public void notifyObservers(String message){
for(Observer o : this.observers){
o.update(this,message);
}
}
}
具体被观察者
public class SubjectImp extends Subject {
public void doSomething(){
System.out.println("i want to do something");
super.notifyObservers("something must to be done");
}
}
观察者
public interface Observer {
void update(Subject subject, String message);
}
具体观察者
public class ObserverImp implements Observer {
private final static ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
@Override
public void update(Subject subject, final String message) {
pool.execute(() -> System.out.println("observer receive " + " message : " + message));
}
}
测试驱动
public class Main {
public static void main(String[] args) {
SubjectImp subject = new SubjectImp();
ObserverImp observer1 = new ObserverImp();
subject.addObserver(observer1);
ObserverImp observer2 = new ObserverImp();
subject.addObserver(observer2);
subject.doSomething();
}
}
有什么需要注意的地方
关于消息处理的及时性这里是需要注意的地方,同步状态下若观察者处理消息太慢或者观察者太多,导致被观察者发送消息被阻塞。所以示例中观察者通过多线程来处理接收到的消息。