观察者模式属于设计模式中的行为型模式,也叫发布-订阅模式,实际上是一种事件监听机制。
基本思想是:有观察者和被观察者两种角色,当被观察者的行为有变化的时候(方法被调用),观察者就能被通知到。想成为被观察者的观察者,需要在被观察者那里登记。
角色:
Watcher(观察者接口)
ConWatcher(具体观察者)
Watched(被观察者接口)
ConWatched(具体被观察者)
代码:
观察者抽象
public interface Watcher {
//被通知的方法
public void update();
}
具体观察者
public class ConWatcher implements Watcher{
@Override
public void update() {
System.out.println(this+"被通知了");
}
}
被观察抽象
public interface Watched {
public void attach(Watcher w);
public void detach(Watcher w);
public void notifyWatcher();
}
具体被观察者
public class ConWatched implements Watched{
List<Watcher> list = new ArrayList<Watcher>();
/**
* 观察者需要在被观察者那里登记
*/
@Override
public void attach(Watcher w) {
list.add(w);
}
@Override
public void detach(Watcher w) {
list.remove(w);
}
/**
* 通知所有观察者
*/
@Override
public void notifyWatcher() {
for(Watcher w:list){
w.update();
}
}
/**
* 被观察的事件
*/
public void change(){
this.notifyWatcher();
}
}
测试
public class Client {
public static void main(String[] args) {
ConWatched zhangsan=new ConWatched();//被观察者
Watcher watcher1 = new ConWatcher();//观察者
Watcher watcher2 = new ConWatcher();
zhangsan.attach(watcher1);//到观察者那里登记
zhangsan.attach(watcher2);
zhangsan.change();//被观察者变化了
}
}
运行结果:
com.pattern.Observe.one.ConWatcher@9945ce被通知了
com.pattern.Observe.one.ConWatcher@b5dac4被通知了
由此可见,两个观察对象都被通知了