观察者(observer)模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们自动更新自己。
观察者模式的组成:①抽象主题角色 ②抽象观察者角色 ③具体主题角色 ④具体观察者角色
抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者,抽象主题提供一个接口,可以增/删观察者角色。一般用一个抽象类或接口来实现。
抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存在一个指向具体主题角色的引用。通常用一个子类实现。
?
观察者模式实例: package com.hzp.observer; //抽象主题角色 public interface SubjectInterface { public void add(Observer obs);//添加观察者 public void del(Observer obs); //移除观察者 public void notifyObserver(); //通知观察者 } package com.hzp.observer; import java.util.ArrayList; import java.util.List; //具体主题角色 public class Subject implements SubjectInterface { //保存观察者对象的引用 List<Observer> list=new ArrayList<Observer>(); //添加观察者 public void add(Observer obs) { list.add(obs); } //移除观察者 public void del(Observer obs) { list.remove(obs); } //通知观察者 public void notifyObserver() { for(Observer obs:list){ //状态改变,通知所有观察者 obs.update(list.indexOf(obs)); } } //外部调用通知方法的通道 public void notifyObs(){ this.notifyObserver(); } } package com.hzp.observer; //抽象观察者角色 public abstract class AbObserver { //观察者接到通知,输出相关更新信息 public abstract void update(Object o);//更新信息 } package com.hzp.observer; //具体观察者角色 public class Observer extends AbObserver{ //观察者接到通知,输出相关更新信息 public void update(Object o) { System.out.println("观察者"+o+"接到通知"); System.out.println("观察者:"+o+"更新自己"); } } package com.hzp.observer; //测试类 public class Client { public static void main(String[] args){ Subject sub=new Subject();//实例化一个主题角色 //实例化两个观察者角色 Observer obs1=new Observer(); Observer obs2=new Observer(); //向主题角色添加观察者 sub.add(obs1); sub.add(obs2); //主题角色状态更新,通知所有观察者 sub.notifyObs(); System.out.println("***************"); //主题角色状态更新,通知所有观察者 sub.del(obs2); sub.notifyObs(); } } 最后输出结果为: 观察者0接到通知 观察者:0更新自己 观察者1接到通知 观察者:1更新自己 *************** 观察者0接到通知 观察者:0更新自己
?