当被观察的对象发生指定的动作时,要通知所有观察的对象做出相应的处理。
实现方式
把要通知的行为定义成接口(当被观察者对象发生指定动作时,要通知观察者对象做出相应的处理,这时候就要把观察者对象的相应处理方法,定义在接口上)。
当被观察者发生指定的动作时,即调用观察者接口中的方法。
经典场景:气象站发布天气更新通知
观察者,订阅接口
interface ISubscribe {
//订阅接口
void subscribeWeather(String curWeather);
//通知接口
void notifySubscribe(String message);
}
气象站接口
interface IWeatherWork {
// 增加订阅
void addSubscribe(ISubscribe subscribe);
// 移除订阅
void removeSubscribe(ISubscribe subscribe);
}
模拟气象站发布气象
class WeatherStation implements IWeatherWork {
// 模拟天气
private String[] weathers = {"晴天", "下雨", "冰雹", "刮风", "多云"};
private String curWeather;
// 维护订阅,通知的对象集合引用
private ArrayList<ISubscribe> subscribeList = new ArrayList<>();
//天气更新通知
public void weatherWork() {
new Thread(new Runnable() {
@Override
public void run() {
Random random = new Random();
//这是关键,要一直运行
while (true) {
updateWeather(); //数据更新
//给订阅者,不断发送更新后的数据内容
for (ISubscribe item : subscribeList) {
item.notifySubscribe(curWeather);
item.subscribeWeather(curWeather);
}
// 睡眠1~1.5s
int s = random.nextInt(501) + 1000;
try {
Thread.sleep(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
// 更新天气数据
public void updateWeather() {
Random random = new Random();
int index = random.nextInt(weathers.length);
curWeather = weathers[index];
// System.out.println("当前天气:" + curWeather);
}
// 增加订阅
@Override
public void addSubscribe(ISubscribe subscribe) {
subscribeList.add(subscribe);
}
// 取消订阅
@Override
public void removeSubscribe(ISubscribe subscribe) {
subscribeList.remove(subscribe);
}
}
实现订阅接口
class Emp implements ISubscribe {
private String name;
public Emp(String name) {
this.name = name;
}
@Override
public void subscribeWeather(String curWeather) {
switch (curWeather) {
case "晴天":
System.out.println(name + curWeather + "工作");
break;
case "多云":
System.out.println(name + curWeather + "工作");
break;
}
}
@Override
public void notifySubscribe(String message) {
System.out.println("今天天气更新通知:" + message);
}
}
public static void main(String[] args) {
WeatherStation station = new WeatherStation();
Emp emp = new Emp("雇工");
station.addSubscribe(emp); //增加订阅
station.weatherWork();
}