设计模式之观察者

来源:互联网 发布:格非江南三部曲 知乎 编辑:程序博客网 时间:2024/04/25 18:40

Internet气象站例题:
提供温度、气压和湿度的接口
测量数据更新时需时时通知给第三方
需要设计开放型API,便于其他第三方公司也能接入气象站获取数据

这里写图片描述

观察者模式原理:

1、观察者模式就像定牛奶业务
1)奶站,Subject
2)用户,Observer
2、Subject:登记注册、移除和通知
这里写图片描述
3、Observer:接收输入
这里写图片描述
4、观察者模式: 对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化

用观察者模式设计的例题方案

这里写图片描述

1 两个接口package com.sk.superInterface;public interface Subject{    public void registerObserver(Observer observer);    public void removeObserver(Observer observer);    public void notifyObservers();}package com.sk.superInterface;public interface Observer{    public void update(float temprature,float pressure,float humidity);}2. 继承接口package com.sk.mode;import java.util.ArrayList;import com.sk.superInterface.Observer;import com.sk.superInterface.Subject;public class WeatherData implements Subject{    private float m_temprature;    private float m_pressure;    private float m_humidity;    private ArrayList<Observer> m_observers;    public WeatherData()    {        m_observers=new ArrayList<Observer>();    }    public void setData(float m_temprature,float m_pressure,float m_humidity)    {        this.m_temprature=m_temprature;        this.m_pressure=m_pressure;        this.m_humidity=m_humidity;        dataChange();    }    //改变数据之后就要通知所有的观察者    private void dataChange()    {        notifyObservers();    }    @Override    public void registerObserver(Observer observer)    {        m_observers.add(observer);    }    @Override    public void removeObserver(Observer observer)    {        if(m_observers.contains(observer))        {            m_observers.remove(observer);        }    }    @Override    public void notifyObservers()    {        for (int i = 0,len=m_observers.size(); i < len; i++)        {            m_observers.get(i).update(getM_temprature(), getM_pressure(), getM_humidity());        }    }    public float getM_temprature()    {        return m_temprature;    }    public float getM_pressure()    {        return m_pressure;    }    public float getM_humidity()    {        return m_humidity;    }    public ArrayList<Observer> getM_observers()    {        return m_observers;    }}package com.sk.mode;import java.awt.DisplayMode;import com.sk.superInterface.Observer;public class CurrentConditions implements Observer{       private float m_temprature;    private float m_pressure;    private float m_humidity;    @Override    public void update(float temprature, float pressure, float humidity)    {        this.m_humidity=humidity;        this.m_pressure=pressure;        this.m_temprature=temprature;        display();    }    public void display()    {        System.out.println("***Today's weather***");        System.out.println("***temprature:***"+m_temprature);        System.out.println("***pressure***"+m_pressure);        System.out.println("***humidity***"+m_humidity);    }}3. 入口package com.sk.main;import com.sk.mode.CurrentConditions;import com.sk.mode.ForecastConditions;import com.sk.mode.WeatherData;public class InternetWeather{    public static void main(String[] args)    {        CurrentConditions conditions=new CurrentConditions();        ForecastConditions forecastConditions=new ForecastConditions();        WeatherData weatherData=new WeatherData();        weatherData.registerObserver(conditions);        weatherData.registerObserver(forecastConditions);        weatherData.setData(35, 150, 40);        weatherData.removeObserver(conditions);        weatherData.setData(45, 160, 50);    }}

Java内置观察者

1、Java内置的观察者
Observable
Observer

2、用Java内置观察者重新设计该项目
3、内置观察者的注意点
Observable是类而不是接口

Code 地址

http://download.csdn.net/detail/kaikai_sk/9872222

原创粉丝点击