一、观察者模式
JAVA设计模式有23种,平时工作中也使用了一些,比如单例,模板,策略,建造者等,但最近在学习zk过程中,发现zk提供的发布订阅功能和设计模式里面的观察者模式原理差不多,故顺便了解观察者模式是如何实现的,整体来说比较简单,一个被观察者,N个观察者,当被观察者的行为发生改变的时候,观察者能够监听到这个变化,从而做出相应的行为处理。
二、代码实现
这里我们模拟实现一个这样的场景,上级公司领导来视察,分子公司要通知各个部门做好相关的接待工作,比如领导来了后,保安室做好安保工作,前台做好接待工作,业务部门做好业务交流工作等。
被观察者抽象类
import java.util.ArrayList;
import java.util.List;
public abstract class Subject被观察者 {
public List<Observer> list = new ArrayList<Observer>();
/**添加观察者 */
public void addObserver(Observer observer) {
this.list.add(observer);
}
/** 删除观察者*/
public void deleteObserver(Observer observer) {
this.list.remove(observer);
}
/** 通知观察者 */
public void notifyAllObserver() {
for(final Observer obs : list) {
obs.doSomething();
}
}
public abstract void doSomething();
}
观察者接口
public interface Observer {
void doSomething();
}
被观察者实现类
public class Leader extends Subject被观察者 {
@Override
public void doSomething() {
System.out.println("领导已经到达公司门口,请各部门做好相关准备!");
this.notifyAllObserver();
}
}
当被观察者发生行为变化的时候,就要通知各个观察者
第一个观察者:保安室观察者
public class 保安室观察者 implements Observer{
@Override
public void doSomething() {
System.out.println("我们是保安室,刚收的通知说领导已经到了,请把车库车位挪一下");
}
}
第二个观察者:部门观察者
public class 部门观察者 implements Observer{
@Override
public void doSomething() {
System.out.println("我们是部门观察者,刚收的通知说领导已经到了,请各位做好相关任务工作");
}
}
运行如下代码
public static void main(String[] args) {
Subject被观察者 subject被观察者 = new Leader();
subject被观察者.addObserver(new 保安室观察者());
subject被观察者.addObserver(new 部门观察者());
subject被观察者.doSomething();
}
运行后效果如下
领导已经到达公司门口,请各部门做好相关准备!
我们是保安室,刚收的通知说领导已经到了,请把车库车位挪一下
我们是部门观察者,刚收的通知说领导已经到了,请各位做好相关任务工作