观察者模式,老生常谈的问题了,相信大家都有所了解,这里用通俗的语言简单介绍一下!
概念:
顾名思义,"观察者" 存在,必然存在被观察者。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("开始考试!");
// 开始zuobi
if(cheat()){
// 激活状态,并 执行观察者操作
super.setChanged();
super.notifyObservers();
}
}
// 被观察的行为--zuobi
private boolean cheat(){
System.out.println("开始zuobi啦");
return true;
}
}
// 这是一个老师观察者类
// 假设老师A ,发现了会没收试卷
public class TeacherA implements Observer{
@Override
public void doSomething(Observable ob, Object o) {
System.out.println(TeacherA.class.getName()+"没收试卷!");
}
}
public class TeacherB implements Observer{
@Override
public 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();
}
}