观察者模式
当一个被观察者的行为发生变化的时候,需要通知所有被注册的观察者,这种模式就被称为观察者模式。
那么这种模式怎么实现呢?
我们把被观察者抽象出来为一个接口,称为主题接口,所有被观察者也抽象出来,称为观察者接口。主题接口里面有三个方法,分别是注册一个观察者,去除一个观察者,通知观察者发生变化,在观察者接口里有一个方法, 就是更新。
好的,接下来我们就开始写主题接口了。
public interface MyObserverable {
//发送一个消息
void post();
//注册一个观察者
void addObserver(MyObserver m);
//解除一个观察者
void removeObserver(MyObserver m);
}
接着写观察者接口
public interface MyObserver {
//更新消息
void update(MyObserverable observerable,Object obj);
}
观察者,因为要收到消息,因此在方法传参中传入了obj参数。
接着是一个主题接口实现的类
public class Store implements MyObserverable{
private String msg;
List<MyObserver> oList = new ArrayList<MyObserver>();
public void post() {
for (MyObserver o:oList) {
o.update(this, msg);
}
}
public void addObserver(MyObserver m) {
oList.add(m);
}
public void removeObserver(MyObserver m) {
int i = oList.indexOf(m);
if (i>0) {
oList.remove(m);
}
}
public void setMsg(String msg) {
this.msg = msg;
}
}
可以看到其实在观察者实现的类中就是把这些方法都实现了,在其内部有一个list容器,然后要注册的观察者添加进来,当内容发生改变的时候,通过遍历容器,通过观察者的update方法进行更新。
接着是一个观察者接口实现的类:
public class Person implements MyObserver{
public void update(MyObserverable observerable, Object obj) {
System.out.println("收到消息:"+obj);
}
}
最后是测试:
public class Test {
public static void main(String[] args) {
Store store = new Store();
Person person = new Person();
store.addObserver(person);
Person2 person2 = new Person2();
store.addObserver(person2);
store.setMsg("消息");
store.post();
}
}
可以看到,使用的步骤就是:
- 注册
- 主题类发生变化。
- 发送消息。
在Java中内置了Observerable,observer类,因此我们只要实现该接口即可。