• 设计模式之二:观察者模式(简单实现(气象站模拟流程))


    观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 当你试图勾勒观察者模式时,可以利用报纸订阅服务,以及出版者和订阅者比拟这一切。

    设计原则:为了交互对象之间的松耦合设计为努力。

    工程名称:SubjectAndObsever(eclipse) 下载目录:http://www.cnblogs.com/jrsmith/admin/Files.aspx , SubjectAndObsever.zip

     1 package com.jyu.interfaces;
     2 
     3 /**
     4  * 主题接口
     5  * @author JRSmith
     6  *
     7  */
     8 public interface Subject {
     9 
    10     /**注册观察者*/
    11     public void registerObsever(Obsever obsever);
    12     /**撤销观察者*/
    13     public void removeObsever(Obsever obsever);
    14     /**通知观察者*/
    15     public void notifyObsever();
    16 }
     1 package com.jyu.interfaces;
     2 
     3 /**
     4  * 观察者接口
     5  * @author JRSmith
     6  *
     7  */
     8 public interface Obsever {
     9     /**当气象观测值改变时,主题会把这些状态值当做方法的参数,传送给观察者*/
    10     public void update(float temp,float humidity,float pressure);
    11 }
     1 package com.jyu.interfaces;
     2 
     3 /**
     4  * 布告板接口
     5  * @author JRSmith
     6  *
     7  */
     8 public interface DisplayElement {
     9     /**当布告板需要显示时,调用此方法*/
    10     public void display();
    11 }
    View Code
     1 package com.jyu.implement;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import com.jyu.interfaces.Obsever;
     7 import com.jyu.interfaces.Subject;
     8 
     9 public class WeatherData implements Subject {
    10 
    11     private List<Obsever> obsevers;
    12     private float temperature;
    13     private float humidity;
    14     private float pressure;
    15     
    16     public WeatherData(){
    17         obsevers = new ArrayList<Obsever>();
    18     }
    19     
    20     @Override
    21     public void registerObsever(Obsever obsever) {
    22         obsevers.add(obsever);
    23     }
    24 
    25     @Override
    26     public void removeObsever(Obsever obsever) {
    27         int i = obsevers.indexOf(obsever);
    28         if(i>=0){
    29             obsevers.remove(i);
    30         }
    31     }
    32 
    33     @Override
    34     public void notifyObsever() {
    35         int size = obsevers.size();
    36         for(int i = 0; i< size; i++){
    37             Obsever obsever = obsevers.get(i);
    38             obsever.update(temperature, humidity, pressure);
    39         }
    40     }
    41 
    42     /**
    43      * 当从气象站得到更新观测值时,我们通知观测者
    44      */
    45     public void measurementsChanged(){
    46         notifyObsever();
    47     }
    48     
    49     public void setMeasurements(float temperature,float humidity,float pressure){
    50         this.temperature = temperature;
    51         this.humidity = humidity;
    52         this.pressure = pressure;
    53         measurementsChanged();
    54     }
    55 }
    View Code
     1 package com.jyu.implement;
     2 
     3 import com.jyu.interfaces.DisplayElement;
     4 import com.jyu.interfaces.Obsever;
     5 import com.jyu.interfaces.Subject;
     6 
     7 public class CurrentConditionDisplay implements Obsever, DisplayElement {
     8 
     9     private float temperature;
    10     private float humidity;
    11     private Subject weatherData;
    12     
    13     /**构造器需要weatherData对象(也就是主题)作为注册之用*/
    14     public CurrentConditionDisplay(Subject weatherData){
    15         this.weatherData = weatherData;
    16         weatherData.registerObsever(this);
    17     }
    18     
    19 
    20     @Override
    21     public void update(float temp, float humidity, float pressure) {
    22         this.temperature = temp;
    23         this.humidity = humidity;
    24         display();
    25     }
    26 
    27     @Override
    28     public void display() {
    29         System.out.println("Currnet conditions:"+temperature+"F degree and "+humidity+"%humidity");
    30     }
    31 }
     1 package com.jyu.test;
     2 
     3 import com.jyu.implement.CurrentConditionDisplay;
     4 import com.jyu.implement.WeatherData;
     5 
     6 public class WeatherStation {
     7 
     8     /**
     9      * @param args
    10      */
    11     public static void main(String[] args) {
    12         WeatherData weatherData = new WeatherData();
    13         
    14         CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(weatherData);
    15         
    16         weatherData.setMeasurements(80, 65, 30.4f);
    17     }
    18 
    19 }
  • 相关阅读:
    MyEclipse和Microsoft Visual Studio常用快捷键
    数据源与JNDI资源实现JSP数据库连接池实例
    Tomcat配置+JSP页面模板修改UTF-8
    jquery插件
    jsp地址栏传中文显示乱码解决方法
    Java Web Project自定义错误页面,log4j记录日志。
    [原创] Java JDBC连接数据库,反射创建实体类对象并赋值数据库行记录(支持存储过程)
    测试上传图片
    js获取日期:昨天今天和明天、后天
    Axure谷歌浏览器Chrome扩展程序下载及安装方法
  • 原文地址:https://www.cnblogs.com/damonhuang/p/2683531.html
Copyright © 2020-2023  润新知