zoukankan      html  css  js  c++  java
  • 设计模式-观察者模式(上)<转>

    本文参考Head First设计模式一书,感觉书中的例子实在很好,很贴切。对模式的知识点进行总结,并对书的源码做了一定注释。
     
    观察者模式要点有二:主题和观察者。
    最贴切的案例是:杂志订阅,杂志是主题,观察者是订阅者。当出版新杂志时候,这个事件会自动通知所有的订阅者。
    根据OO基本原则,应该针对接口编程(当然原因很多),主题和订阅者一般都作为接口。
     
    下面是Head First的例子,是一个气象站,用户订阅气象信息的服务。
     
    并且,最终用户所要的信息可能是:
     
    针对这个需求,应用观察者模式来实现:
    但是这个只是一个主题与观察者的设计,观察者自身还需要将信息显示出去。那么再用一个接口,专门来实现展示的功能。
     
     
    实际上,上面的DisplayElement接口用再此处,本质上是策略模式的应用。
     
    理解每个模式的特点对交流和设计都有很大帮助,当OO思想境修炼到很高的程度时,应该是忘掉所有的模式,而可以根据需要做出最佳设计,这个程度可以算手中无剑,心中有剑的地步。
     
    下面是源码,只列出接口:
    /** 
    * 主题 
    */
     
    public interface Subject { 
      public void registerObserver(Observer o); 
      public void removeObserver(Observer o); 
      public void notifyObservers(); 
    }
     
    /** 
    * 观察者 
    */
     
    public interface Observer { 
      public void update(float temp, float humidity, float pressure); 
    }
     
    /** 
    * 布告板 
    */
     
    public interface DisplayElement { 
      public void display(); 
    }
     
    测试main方法:
      public static void main(String[] args) { 
                    //创建主题 
        WeatherData weatherData = new WeatherData(); 
                    //创建三个观察者 
        CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData); 
        StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); 
        ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); 
        HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData); 
                    //进行气象测量,主题的状态会因为测量值而改变 
        weatherData.setMeasurements(80, 65, 30.4f); 
        weatherData.setMeasurements(82, 70, 29.2f); 
        weatherData.setMeasurements(78, 90, 29.2f); 
      }
     
    本例仅仅是为了说明这种模式,设计还远不够完美。实际上,主题中应该有一个线程去扫描状态的变化,当变化了,自动去调用measurementsChanged()方法。
     
    观察者模式使用很普遍,GUI编程中事件注册就是典型的观察者模式的应用。
     
    以上是自己实现的观察者模式,下文将讲述JDK所实现的观察者模式。

    本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/201617

  • 相关阅读:
    Linux下tty/pty/pts/ptmx详解
    ubuntu 12 或更高版本 下安装和配置 xrdp 远程登陆
    ubuntu+apache2+php5+mysql5.0的安装
    Ubuntu SSH 服务安装配置和使用
    ubuntu 12.10 进入命令行界面 (字符界面)
    ubuntu 下使用 cron 和 crontab
    Ubuntu用命令行发邮件mutt,报警发短信通知
    Ubuntu 安装 proftpd,并添加虚拟用户
    绝对有效的 ubuntu 12.xx 下 apache2 + svn 安装和配置方法
    添加android系统通知
  • 原文地址:https://www.cnblogs.com/winkey4986/p/5148873.html
Copyright © 2011-2022 走看看