观察者模式原理很好理解,就是定义一个观察者,一个目标,当目标状态发生改变时,通知观察者,观察者做出相应动作。目标与观察者是一对多的依赖关系。
举个例子:
我们开车,遇到红绿灯,这时候司机就是观察者,目标就是红绿灯,可以有多个司机瞅着一个红绿灯(多对一),比如当前红灯,司机们盯着红绿灯,红绿灯由红灯变绿灯,司机们眼睛瞅到红绿灯变化(得到通知),启动汽车,通过该路口。
观察者模式UML类图:
示例代码:
抽象目标类:
/*****
* 抽象目标类
* @author wjw
*
*/
public abstract class Subject {
protected List<Observer> observes = new ArrayList<Observer>();
//添加观察者方法
public abstract void addObserver(Observer observer);
//删除观察者方法
public abstract void deleteObserver(Observer observer);
//目标状态发生改变
public abstract void changeState();
//通知方法(当目标状态发生改变,该方法被调用)
public abstract void notifyObserver();
}
/*****
* 红绿灯目标类
* @author wjw
*
*/
public class LampSubject extends Subject{
@Override
public void addObserver(Observer observer) {
// TODO Auto-generated method stub
observes.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
// TODO Auto-generated method stub
observes.remove(observer);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
Iterator<Observer> iterator = observes.iterator();
while(iterator.hasNext()){
Observer observer = iterator.next();
observer.change();
}
}
@Override
public void changeState() {
// TODO Auto-generated method stub
System.out.println("红灯变绿灯!");
System.out.println("--通知老司机--");
this.notifyObserver();
}
}
观察者接口:
/****
* 观察者接口,定义了目标对象发生改变后观察者的改变方法
* @author wjw
*
*/
public interface Observer {
void change();//观察者接到通知后的动作
}
具体观察者1,2(老司机):
/****
* 具体观察者(老司机1)
* @author wjw
*
*/
public class Driver1Observer implements Observer{
@Override
public void change() {
// TODO Auto-generated method stub
System.out.println("老司机1看到了红灯变绿灯,一言不合就开车!");
}
}
/****
* 具体观察者(老司机2)
* @author wjw
*
*/
public class Driver2Observer implements Observer{
@Override
public void change() {
// TODO Auto-generated method stub
System.out.println("老司机2看到了红灯变绿灯,二话不说就开车!");
}
}
Main类:
public class Main {
public static void main(String[] args) {
//new一个目标对象(红绿灯)
Subject subject = new LampSubject();
//new两个观察者对象
Observer observer1 = new Driver1Observer();//老司机1
Observer observer2 = new Driver2Observer();//老司机2
//观察者观察目标(将观察者对象添加到目标对象中观察者集合中,表示该对象正在观察)
subject.addObserver(observer1);
subject.addObserver(observer2);
//目标状态变化(红灯变绿灯)
subject.changeState();
}
}
运行结果:
红灯变绿灯!
--通知老司机--
老司机1看到了红灯变绿灯,一言不合就开车!
老司机2看到了红灯变绿灯,二话不说就开车!
通过上面例子应该足够把观察者模式原理说清了
如有错误,欢迎指正
end