當被觀察的對象發(fā)生指定的動作時,要通知所有觀察的對象做出相應(yīng)的處理。
實現(xiàn)方式
把要通知的行為定義成接口(當被觀察者對象發(fā)生指定動作時,要通知觀察者對象做出相應(yīng)的處理,這時候就要把觀察者對象的相應(yīng)處理方法,定義在接口上)。
當被觀察者發(fā)生指定的動作時,即調(diào)用觀察者接口中的方法。
經(jīng)典場景:氣象站發(fā)布天氣更新通知
觀察者,訂閱接口
interface ISubscribe {
//訂閱接口
void subscribeWeather(String curWeather);
//通知接口
void notifySubscribe(String message);
}
氣象站接口
interface IWeatherWork {
// 增加訂閱
void addSubscribe(ISubscribe subscribe);
// 移除訂閱
void removeSubscribe(ISubscribe subscribe);
}
模擬氣象站發(fā)布氣象
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();
//這是關(guān)鍵,要一直運行
while (true) {
updateWeather(); //數(shù)據(jù)更新
//給訂閱者,不斷發(fā)送更新后的數(shù)據(jù)內(nèi)容
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();
}
// 更新天氣數(shù)據(jù)
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);
}
}
實現(xiàn)訂閱接口
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();
}