java 第6集 观察者模式

本文介绍Java中的观察者模式,它属于发布订阅模式的一种。在该模式中,发布者发布消息时,订阅者能接收到通知。文章将详细讨论观察者模式的设计,包括发布者、抽象观察者和具体观察者的角色,并通过一个气象站与多个天气预报观察者的例子进行说明。

一、观察者模式

观察者模式就是其实就是发布订阅模式,发布者发布消息后,订阅者就可以就可以得到消息通知。
观察者模式设计
发布者
抽象的观察者
具体的观察者
有一个气象站,多个观察者订阅天气预报,气象站会向已订阅的观察者订阅天气预报。

①天气信息

package k;
public class WeatherData {
	//温度
	private int temperature;
	//风力
	private int windPower;
	public WeatherData(int temperature, int windPower) {
		this.temperature = temperature;
		this.windPower = windPower;
	}
	public int getTemperature() {
		return temperature;
	}
	public void setTemperature(int temperature) {
		this.temperature = temperature;
	}
	public int getWindPower() {
		return windPower;
	}
	public void setWindPower(int windPower) {
		this.windPower = windPower;
	}	
}

②观察者(天气接受者)

package k;
//一个接口,抽象的观察者,所有实现该接口的类的对象都是观察者,如 “墨迹天气”APP
public interface WeatherObserver {
	//观察者接收气象台发布的数据
	void update(WeatherData data);//接口不会定义方法的具体内容
	//WeatherData data中data引用的是WeatherData类一个对象
}
//具体的观察者
class RealObserver implements WeatherObserver{
	//观察者的名字
	private String name;//新添一个属性
	public RealObserver(String name) {
		this.name=name;
		}	
	//当气象数据传递进来以后,在控制台输出气象数据
	public void update(WeatherData data) {  
		System.out.println(name +"收到天气数据");
		System.out.println("温度:"+data.getTemperature());
		System.out.println("风力:"+data.getWindPower());
		
	}
}

③气象站

package k;
public class WeatherStation {
	//定义一个数组,来保存注册的观察者
	private WeatherObserver[] observers=new WeatherObserver[10];//最多注册10个
	
	private int count =0;//已注册观察者数量
	
	//注册观察者
	public void register(WeatherObserver  observer) {
		if (count>=10) {
			System.out.println("人数已达到限制");		
		}else {
			observers[count]=observer;
			count++;
		} 
	}
	
	//发布数据,通知观察者
	public void notifyObserver(WeatherData data) {
		//逐个通知观察者
		for(int i=0;i<=count ;i++) {
			//调用观察者的update方法,传递天气数据
			observers[i].update(data);
		}
	}

}

④执行

package k;

public class day1405 {
	public static void main(String[] args) {
		WeatherStation ws=new WeatherStation();
		
		WeatherObserver o1=new RealObserver("观察者1");
		//接口类型的变量去引用类的实例
		WeatherObserver o2=new RealObserver("观察者2");
		WeatherObserver o3=new RealObserver("观察者3");
		WeatherObserver o4=new RealObserver("观察者4");
		WeatherObserver o5=new RealObserver("观察者5");
		
		ws.register(o1);
		ws.register(o2);
		ws.register(o3);
		ws.register(o4);
		ws.register(o5);
		
		WeatherData  data =new WeatherData(30,2);
		ws.notifyObserver(data);		
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值