观察者模式和JDK 提供Observer
观察者模式,老生常谈的问题了,相信大家都有所了解,这里用通俗的语言简单介绍一下!
?
概念:
? ? ? 顾名思义,"观察者" 存在,必然存在被观察者。JAVA 里面我们统称为对象。简单的说:比如
1.你参加高考,肯定会有监考老师,那么老师就是观察者,你就是被观察者。
2.当然观察者可以不只一个,可以存在多个观察者,同理被观察者也可以是多个,也就是多个老师观察多个学生。
3.老师肯定会观察你的考试是否存在zuobi行为,一旦发现任何zuobi行为,有的老师没收你的试卷,
? ? ?有的老师可能去上报,也就是说观察者会根据你的行为采取不同的措施,来共同处理你zuobi这一行为。
4.特征:
? ? ?你会发现观察者和被观察者,相对独立,学生考试,监考老师绝对不会打扰
? ? ?同时观察者或者被观察者可以被重复利用,或者替换,也就是说,如果考试中途出现事故,可以有其他
? ? ?老师代为监考。
? ? ?
?
?
下面我来简单设计一下。
1.我们要有学生:Students ,同时有考试和zuobi的能力:exam(),cheat()
2.我们要有老师:TeachearA,B,同时具有自己实现的行为:没收试卷,和上报
3.虽然不同观察者(老师),行为不同,但是他们都是内部实现不同,这里我们统一独立出来一个接口Observer,方法soSomething(),让观察者自己去实现
4.基本对象有了,我们还需要一个管理观察者 和 被观察者的监控管理器Observable,方便我们进行处理
?
看代码:
?
// 被观察者,学生public class Students extends Observable{// 被观察的行为--考试public void exam(){System.out.println("开始考试!");// 开始zuobiif(cheat()){// 激活状态,并 执行观察者操作super.setChanged();super.notifyObservers();}}// 被观察的行为--zuobiprivate boolean cheat(){System.out.println("开始zuobi啦");return true;}}?
// 这是一个老师观察者类// 假设老师A ,发现了会没收试卷public class TeacherA implements Observer{@Overridepublic void doSomething(Observable ob, Object o) {System.out.println(TeacherA.class.getName()+"没收试卷!");}}?
public class TeacherB implements Observer{@Overridepublic void doSomething(Observable ob, Object o) {System.out.println(TeacherB.class.getName()+"上报考试中心!");}}?
// 这个是观察者,接口,方便我们去实现 各个观察者的动作public interface Observer {// 参数,可以在实现过程中,获得其他信息// Observable:管理器,Object 被观察者public void doSomething(Observable ob,Object o);}?
// 观察者的一个管理器public class Observable {private boolean isChanged = false;// 激活观察者触发 条件public synchronized void setChanged(){isChanged = true;}// 观察者集合,里面可以存放多个老师,Vector 是线程安全的private Vector obs;public Observable(){obs = new Vector();}// 添加一个观察者public void addObserver(Observer o){if(o == null) throw new NullPointerException();if(!obs.contains(o)){obs.addElement(o);}public void notifyObservers(){if(isChanged){Object[] array = obs.toArray();for(Object o : array){Observer ob = (Observer) o;ob.doSomething(this, o);}}}// 返回观察者的个数public int countObservers(){return obs.size();}}?
public class Test{public static void main(String[] args) {Students s = new Students();TeacherA a = new TeacherA();TeacherB b = new TeacherB();s.addObserver(a);s.addObserver(b);s.exam();}}?