设计模式之观察者模式:天气布告板

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);	//主题的天气数据改变
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值