观察者模式,即需要有观察者主题Subject,还有观察者Observe,以及通知者Notify.我们可以动态的添加观察者,以及批量通知观察者。这样可以达到观察和主题之间的解耦。在springboot源码里面可以明显看到观察者模式的运用了,有兴趣可以了解一下。观察者模式代码如下。
抽象主题
/**
* 抽象主题
*/
public abstract class Subject {
/**
* 添加观察者
* @param observe
*/
public abstract void addObserve(Observe observe);
/**
*删除观察者
* @param observe
*/
public abstract void removeObserve(Observe observe);
/**
* 通知观察者
*/
public abstract void notifyObserve();
}
主题具体实现
/**
* 具体的主题实现
*/
public class Notify extends Subject {
private List<Observe> observeList = new ArrayList<>();
@Override
public void addObserve(Observe observe) {
this.observeList.add(observe);
}
@Override
public void removeObserve(Observe observe) {
this.observeList.remove(observe);
}
@Override
public void notifyObserve() {
if(observeList.size()>0){
for (Observe observe: observeList) {
observe.dosomething();
}
}
}
}
观察者
/**
* 观察者抽象类
*/
public abstract class Observe {
private Subject subject;
public Observe(Subject subject){
this.subject=subject;
}
/**
* 具体做一些事情的抽象方法
*/
public abstract void dosomething();
}
具体观察者A
/**
* 观察者A
*/
public class ObserveA extends Observe{
public ObserveA(Subject subject) {
super(subject);
}
@Override
public void dosomething() {
System.out.println("我是A...做A事");
}
}
具体观察者B
/**
* 观察者B
*/
public class ObserveB extends Observe {
public ObserveB(Subject subject) {
super(subject);
}
@Override
public void dosomething() {
System.out.println("我是B,做B事情");
}
}
测试
public class ObeserveTest {
public static void main(String[] args) {
Subject subject = new Notify();
Observe observeA= new ObserveA(subject);
Observe observeB= new ObserveB(subject);
//添加观察者
subject.addObserve(observeA);
subject.addObserve(observeB);
//通知
subject.notifyObserve();
}
}
结果
我是A...做A事
我是B...做B事