稳固而知新 Observer

来源:互联网 发布:店铺销售数据分析 编辑:程序博客网 时间:2024/05/16 07:44
OBSERVER
该模式的动机是为了在增加新的观察对象时可以无需更改被观察的对象,被观察对象可以保持封闭。
public class Observable {
       List observers = new ArrayList();
       public boolean addObserver(Observer o) {
              observers.add(o);
       }
       private void fireObserver() {
              for (Observer o : observers) {
                     o.update();
              }
       }
}
         

Context是一个GUI应用程序的唯一上下文实例,用来和服务端交互信息。TaskView是用来显示当前系统的任务列表,它实现了Observer接口,通过Observable的addObserver方法注册到Context中。Context在收到服务端发出的更新命令时,就会调用observable的notify方法,notify方法会调用注册的Observer对象的update方法。执行TaskView的update方法时,TaskView会到到后台中取到所有的Task信息,显示在自己的界面上。
 
上面的例子是一个典型的拉模型,Observer的update被调用后,要自己去取得新的信息,可能的后果是无法分辨信息的实时性。下面的例子为fireObserver方法增加了一个Event参数,将最新的信息发送给Observer.Observer的派生类各自实现自己的业务功能。这是Observer模式的推模型。
      
 
       UserView和EMSView本别用来现实用户和Ems的列表,它们实现了Observer接口,并注册到Context中,Context受到服务端发来的Event信息,就会调用注册其中Observer的update方法,UserView和EMSView通过update接受到了Event消息,分别实现自己的需求。
       推模型比拉模型适应更复杂的情况。



原创粉丝点击