package firstPro;
/*
headfirst设计模式 第二章节 观察者模式,实现了一对多的关系,观察者模式分为主题(subject)和观察者(observer)两个模块,观察者可以
看做是订阅消息的人,主题可以看做推送消息机构,机构有了新消息会立即推送给订阅者,数据是属于消息机构的,订阅者可以取消订阅,就不会
收到相关消息,未订阅者也可以注册添加为新的订阅者
*/
import java.util.ArrayList;
interface Subject //主题接口,声明3个函数,分别为注册新观察者,移除已有观察者,通知所有观察者新消息。
{
public void registerObj(Observer observer);
public void removeObj(Observer observer);
public void notifyObj();
}
interface Observer //观察者接口,只需要更新消息即可
{
public void update(float temperature, float humidity, float pressure);
}
interface Display //显示接口,定义如果把消息显示在面板上
{
public void display();
}
class WeatherData implements Subject //实现一个主题接口
{
private ArrayList observers = new ArrayList(); //存储所有观察者名单的动态列表
private float temperature; //当前温度数据,不同函数可能都要共享这些该数据,因此单独作为属性列出来
private float humidity; //当前湿度数据
private float pressure; //当前压力数据
public void registerObj(Observer observer) //实现注册新订阅者的函数
{
observers.add(observer); //只需把新订阅者加入到列表即可
}
public void removeObj(Observer observer) //实现移除新订阅者的函数
{
int i = observers.indexOf(observer);
if(i > 0)
observers.remove(observer);
}
public void notifyObj() //实现通知所有观察者的函数
{
for(int i = 0; i < observers.size(); i++) //遍历列表里的每一个观察者并通知消息
{
Observer observer = (Observer)observers.get(i);
observer.update(this.temperature, this.humidity, this.pressure);
}
}
public void weatherChanged(float temperature, float humidity, float pressure) //天气数据改变时候执行通知操作
{
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObj();
}
}
class CurConditionDisplay implements Observer,Display //使用一个观察者类同时实现2个接口,java里没有多继承,但是可以多接口
{
private float temperature; //这里只有2条天气数据,这是定制的,该类只需要2条数据,也可以1条数据或者3条
private float humidity;
private Subject weatherdata; //用来保存它的主题,通过主题对象可以实现主动取消订阅等功能
public CurConditionDisplay(Subject subject) //构造函数,再对象创建时自动订阅weatherdata主题,也可以后来单独订阅
{
this.weatherdata = subject; //设置当前订阅的主题,构造函数初始化该主题
subject.registerObj(this); //订阅该主题
}
public void update(float temperature, float humidity, float pressure) //实现更新观察者数据的函数
{
this.temperature = temperature; //更新温度数据
this.humidity = humidity; //更新湿度数据
display(); //显示当前数据
}
public void display()
{
System.out.println("1bord:current condition weather is temperature:" + temperature + "humidity:" + humidity);
}
}
class CHello
{
public static void main(String[] args)
{
WeatherData weatherData = new WeatherData(); //创建主题对象
CurConditionDisplay subscriber1 = new CurConditionDisplay(weatherData); //创建一个订阅者对象
weatherData.weatherChanged(23.5f, 0.8f, 10000.2f); //主题的天气数据改变
}
}
设计模式之观察者模式:天气布告板
最新推荐文章于 2021-08-17 21:14:19 发布