简简单单,今天来个观察者模式
什么叫观察者模式;就是一个对象subject,即被观察者,当它的状态发生改变的时候,它的观察者们能够立马收到通知(收到通知后根据实际场景做出相应的动作)
实现思路也比较简单,对于被观察者subject,它维护一个观察者list,当状态改变,通知到list上的观察者即可;对于观察者,把自己添加到观察者list即可。
被观察者实现
public class Subject {
List<Observer> observers = new ArrayList<>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
System.out.println("subject update.");
notifyAllObservers();
}
public void attach(Observer observer) {
observers.add(observer);
}
private void notifyAllObservers() {
for (Observer observer : observers) {
observer.update();
}
}
public static void main(String[] args) {
Subject subject = new Subject();
new MyObserver(subject);
subject.setState(1);
}
}
被观察者抽象类
public abstract class Observer {
protected Subject subject;
public Observer(Subject subject) {
this.subject = subject;
subject.attach(this);
}
protected abstract void update();
}
观察者实现
public class MyObserver extends Observer {
public MyObserver(Subject subject) {
super(subject);
}
@Override
protected void update() {
System.out.println("MyObserver get subject's state and update itself, subject's state = " + subject.getState());
}
}
简简单单,明明白白
总结
网上都说观察者和被观察者抽象耦合,这是一个优点,我不是很理解,大概意思就是他们之间是同过一些接口耦合在一起的,具体的逻辑实现是分开的?就是我们是分开写观察者和被观察者的逻辑,二者没有直接的交互?我瞎理解的。
缺点的话,我们看到是一个for循环通知被观察者,如果观察者多了,明显的性能问题,怎么改?简单,上异步啊,每个观察者之间是独立的,直接异步提速!如果你的烂观察者之间存在循环依赖,一个调用,烂了啊!
所以,要避免这些缺点,最好是能够设计出,彼此独立的观察者们!
还有一个不算缺点的缺点,被观察者是不知道观察者的状态的,如果你有这方面的需求,可能还要引入其他方案