设计模式(19)--观察者模式

来源:互联网 发布:地方门户源码带手机版 编辑:程序博客网 时间:2024/05/23 15:05

观察者模式原理很好理解,就是定义一个观察者,一个目标,当目标状态发生改变时,通知观察者,观察者做出相应动作。目标与观察者是一对多的依赖关系。

举个例子:

我们开车,遇到红绿灯,这时候司机就是观察者,目标就是红绿灯,可以有多个司机瞅着一个红绿灯(多对一),比如当前红灯,司机们盯着红绿灯,红绿灯由红灯变绿灯,司机们眼睛瞅到红绿灯变化(得到通知),启动汽车,通过该路口。


观察者模式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{@Overridepublic void addObserver(Observer observer) {// TODO Auto-generated method stubobserves.add(observer);}@Overridepublic void deleteObserver(Observer observer) {// TODO Auto-generated method stubobserves.remove(observer);}@Overridepublic void notifyObserver() {// TODO Auto-generated method stubIterator<Observer> iterator = observes.iterator();while(iterator.hasNext()){Observer observer = iterator.next();observer.change();}}@Overridepublic void changeState() {// TODO Auto-generated method stubSystem.out.println("红灯变绿灯!");System.out.println("--通知老司机--");this.notifyObserver();}}

观察者接口:


/**** * 观察者接口,定义了目标对象发生改变后观察者的改变方法 * @author wjw * */public interface Observer {void change();//观察者接到通知后的动作}

具体观察者1,2(老司机):

/**** * 具体观察者(老司机1) * @author wjw * */public class Driver1Observer implements Observer{@Overridepublic void change() {// TODO Auto-generated method stubSystem.out.println("老司机1看到了红灯变绿灯,一言不合就开车!");}}

/**** * 具体观察者(老司机2) * @author wjw * */public class Driver2Observer implements Observer{@Overridepublic void change() {// TODO Auto-generated method stubSystem.out.println("老司机2看到了红灯变绿灯,二话不说就开车!");}}

Main类:


public class Main {public static void main(String[] args) {//new一个目标对象(红绿灯)Subject subject = new LampSubject();//new两个观察者对象Observer observer1 = new Driver1Observer();//老司机1Observer observer2 = new Driver2Observer();//老司机2//观察者观察目标(将观察者对象添加到目标对象中观察者集合中,表示该对象正在观察)subject.addObserver(observer1);subject.addObserver(observer2);//目标状态变化(红灯变绿灯)subject.changeState();}}

运行结果:

红灯变绿灯!
--通知老司机--
老司机1看到了红灯变绿灯,一言不合就开车!
老司机2看到了红灯变绿灯,二话不说就开车!

通过上面例子应该足够把观察者模式原理说清了


如有错误,欢迎指正

end

原创粉丝点击