观察者模式
2019-10-30 本文已影响0人
吃瓜群众666
定义了对象间的一种一对多的依赖关系,当一个对象(目标对象)的状态发生改变时,所有依赖于它的对象(观察者对象)都会得到通知。
实现:
1.定义一个抽象的观察者,里面有一个更新状态的方法供子类自己去实现。
/**
* 抽象的观察者
*/
public interface Observer {
void updateState(Subject subject);
}
2.定义一个目标对象父类,里面包含了一个观察者链表和注册、反注册、广播通知所有观察者状态更新的方法。
/**
* 目标对象父类(被观察者)
*/
public class Subject {
private List<Observer> observerList=new LinkedList<>();
public void register(Observer observer){
observerList.add(observer);
}
public void unRegister(Observer observer){
observerList.remove(observer);
}
public void notifyUpdate(){
for (Observer observer:observerList){
observer.updateState(this);
}
}
}
3.定义一个具体的目标对象类,决定什么时候去进行广播通知。
/**
* 具体的目标对象类(被观察者)
*/
public class WeatherSuject extends Subject {
private String weatherState;
public String getWeatherState() {
return weatherState;
}
/**
* 设置新的天气状态的时候进行广播通知
* @param weatherState
*/
public void setWeatherState(String weatherState) {
this.weatherState = weatherState;
super.notifyUpdate();
}
}
4.定义一个具体的观察者类,自己去实现得到广播通知之后状态更新的方法。
/**
* 具体的观察者
*/
public class WeatherObserver implements Observer {
private String weatherState;
private String name;
private String activity;
@Override
public void updateState(Subject subject) {
weatherState=((WeatherSuject)subject).getWeatherState();
System.out.println(name+":"+weatherState+",我准备去"+activity);
}
public String getWeatherState() {
return weatherState;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getActivity() {
return activity;
}
public void setActivity(String activity) {
this.activity = activity;
}
}
5.调用
public static void main(String args[]){
//1.创建目标
WeatherSuject weatherSuject=new WeatherSuject();
//2.创建观察者
WeatherObserver observerSu=new WeatherObserver();
observerSu.setName("苏小斯");
observerSu.setActivity("图书馆");
WeatherObserver observerYu=new WeatherObserver();
observerYu.setName("吃瓜群众");
observerYu.setActivity("爬山");
//3.观察者注册
weatherSuject.register(observerSu);
weatherSuject.register(observerYu);
//发布事件更新
weatherSuject.setWeatherState("明天天气晴朗,24度,阵风3级");
//当确定不需要再接受广播事件的时候应将其取消
weatherSuject.unRegister(observerSu);
weatherSuject.unRegister(observerYu);
}
6.打印输出
苏小斯:明天天气晴朗,24度,阵风3级,我准备去图书馆
吃瓜群众:明天天气晴朗,24度,阵风3级,我准备去爬山