设计模式之观察者模式
1、测试主类
public class TestSubjectObserver {
public static void main(String[] args) {
// 1.创建目标
SubjectWeather subjectWeather = new SubjectWeather();
// 2.创建观察者
ObserverGirl observerGirl = new ObserverGirl("朋友:", "明天约会,地点大运河公园,不见不散哦");
ObserverMom observerMum = new ObserverMom("老妈:", "明天购物,地点大润发超市");
// 3.注册观察者
subjectWeather.attach(observerGirl);
subjectWeather.attach(observerMum);
// 4.目标发布天气
subjectWeather.pushWeatherContent("明天,天气晴朗,蓝天白云,气温28℃");
subjectWeather.pushWeatherContent("明天,大到暴雨");
}
}
2、观察者接口
/**
* 观察者接口,定义一个更新的接口给那些在目标对象发生改变的时候被通知的对象
*/
public interface Observer {
/**
* 更新的接口
* @param subject 传入的目标对象,方便获取相应的目标对象的状态
*/
void receive(Subject subject);
}
3、观察者一朋友
/**
* 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
*/
public class ObserverGirl implements Observer {
//观察者的名称,是谁收到了这个信息
private String observerName;
//天气的内容信息,这个消息从目标处获取
private String weatherContent;
//提醒的内容,不同的观察者提醒不同的内容
private String remindThing;
public ObserverGirl(String observerName, String remindThing) {
this.observerName = observerName;
this.remindThing = remindThing;
}
//获取目标类的状态同步到观察者的状态中
@Override
public void receive(Subject subject) {
weatherContent = ((SubjectWeather) subject).getWeatherContent();
System.out.println(observerName + " 收到了天气信息【" + weatherContent + "】;准备去做:" + remindThing);
}
}
4、观察者二妈妈
/**
* 具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致
*/
public class ObserverMom implements Observer {
//观察者的名称,是谁收到了这个信息
private String observerName;
//天气的内容信息,这个消息从目标处获取
private String weatherContent;
//提醒的内容,不同的观察者提醒不同的内容
private String remindThing;
public ObserverMom(String observerName, String remindThing) {
this.observerName = observerName;
this.remindThing = remindThing;
}
//获取目标类的状态同步到观察者的状态中
@Override
public void receive(Subject subject) {
weatherContent = ((SubjectWeather) subject).getWeatherContent();
System.out.println(observerName + " 收到了天气信息【" + weatherContent + "】;准备去做:" + remindThing);
}
}
5、目标对象父类
import java.util.ArrayList;
import java.util.List;
/**
* 目标类,目标对象,它知道观察它的观察者,并提供注册(添加)和删除观察者的接口
*/
public class Subject {
/**
* 用来保证注册的观察者对象
*/
private List<Observer> observers = new ArrayList<Observer>();
/**
* 增加观察者
*/
public void attach(Observer observer) {
observers.add(observer);
}
/**
* 删除指定的观察者
*/
public void detach(Observer observer) {
observers.remove(observer);
}
/**
* 通过所有注册的观察者对象
*/
protected void notifyObserver() {
observers.forEach(observer -> {
observer.receive(this);
});
}
}
6、目标对象具象类
/**
* 具体的目标对象,负责把有关状态存入到相应的观察者对象中
*/
@Data
public class SubjectWeather extends Subject {
/**
* 获取天气的内容信息
*/
private String weatherContent;
public void pushWeatherContent(String weatherContent) {
this.weatherContent = weatherContent;
// 内容有了,说明天气更新了,通知所有订阅的人
this.notifyObserver();
}
}
7、输出结果
朋友: 收到了天气信息【明天,天气晴朗,蓝天白云,气温28℃】;准备去做:明天约会,地点大运河公园,不见不散哦
老妈: 收到了天气信息【明天,天气晴朗,蓝天白云,气温28℃】;准备去做:明天购物,地点大润发超市
朋友: 收到了天气信息【明天,大到暴雨】;准备去做:明天约会,地点大运河公园,不见不散哦
老妈: 收到了天气信息【明天,大到暴雨】;准备去做:明天购物,地点大润发超市
学习参考:
https://www.imooc.com/learn/415
还没有评论,来说两句吧...