观察者模式

来源:互联网 发布:电瓶车速度测试软件 编辑:程序博客网 时间:2024/05/01 22:08

定义

定义对象间一种一对多的依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
常用结构
Subject : 目标对象,[一般是接口]
Observer:定义观察者的接口
ConcreteSubject : 具体的目标对象
ConcreteObserver : 观察者的具体实现

实现

一般在Subject中维护这一个Observer的List列表,用于更新时调用。
观察者模式中,又分为推模型和拉模型(ps:可能很多人对这两种模型的概念都基于websocket和comet、ajax的前后端交互,笔者也是(~))。在推模型中,Subject的update方法给每一个Observer传递的是消息内容或者简单封装,而在拉模型中,Subject的update方法给每一个Observer传递的是Subject自身,也就是this。
两种模型的比较:

  • 推模型是假定目标对象知道观察者需要的数据,而拉模型是目标对象不知道观察者需要的数据。
  • 在可扩展性方面,推模型更能很好的使用外部的变化。

java中的观察者模式

public class  Sender extends java.util.Observable{        ...... 数据和函数的封装        private String content ;        publc String  getContent(){            return this.content;        }        //这里是事件触发        public void setContent(String content){            this.content = content;            //下面是必须的            this.setChanged();            //这个是推模型,把content放进去了            this.notifyObservers(this,coent);            //这个是拉模型,直接通知            this.notifyObservers();        }} public class Receiver implements java.util.Observer{    ....数据和函数的封装    public void update(Observable o,Object obj){        //推模型处理        System.out.println("推模型 可以获取内容 :"+obj)        //拉模型,数据需要自己去拿        System.out.println("推模型 可以获取内容 :"+((Sender)o).getContent());    }}//客户端将观察者和被观察者组合起来public class Client{    public static void main(String[]args)    {        Receiver r1 = new Receiver();        Receiver r2 = new Receiver();        Receiver r3 = new Receiver();        Sender s1 = new Sender();        s1.addObserver(r1);        s1.addObserver(r2);        s1.addObserver(r3);        s1.setContent("my name is Obervable");    }}

进行相关实践,当一个观察者多个被观察者的情况下,性能问题就需要解决。
常规方法,采用多线程技术和缓存机制(有没有想到B/S架构,由此引伸出的异步和同步机制,这里面的东西后面细讲)。
当一个被观察者多个观察者的时候,也有相关的问题解决,淘宝在进行大规模开发的时候,一个注册事件就需要同时引起多个事件发生,在大规模数据流动的情况下,性能压力和容错机制需要很完善,淘宝内部开发了相应的机制。
小生愚钝,在学习scala的时候,就遇到过actor的通知机制,后来学习了akka,感觉在scala实现观察者更简单,不知道各位大神怎么看~

No Final is final
0 0
原创粉丝点击