读书人

观察者模式跟JDK 提供Observer

发布时间: 2013-07-20 11:07:48 作者: rapoo

观察者模式和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();}}

?

读书人网 >开源软件

热点推荐