/**
* 抽象被观察者接口:声明了添加、删除、通知观察者方法
*/
public interface Observed {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifyObserver();
}
===============================
/**
* 抽象观察者:定义了一个update()方法,当被观察者调用notifyObservers()方法时,
* 观察者的update()方法会被回调。
*/
public interface Observer {
public void update(String message);
}
===============================
/**
*被观察者,也就是天气服务发布系统
*实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
*/
public class WeatherServer implements Observed {
//注意到这个List集合的泛型参数为Observer接口,
//设计原则:面向接口编程而不是面向实现编程
private List<Observer> list;
private String message;
public WeatherServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o) {
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty()){
list.remove(o);
}
}
@Override
public void notifyObserver() {
for(int i=0;i<list.size();i++){
Observer observer = list.get(i);
observer.update(message);
}
}
public void setInfomation(String s) {
this.message = s;
System.out.println("天气系统更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
===============================
/**
* 定义具体观察者:实现了update方法
*/
public class User implements Observer{
private String name;
private String message;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
read();
}
public void read() {
System.out.println(name + " 收到推送消息: " + message);
}
}
===============================
/**
* 测试类
*/
public class TestObserver {
public static void main(String[] args) {
WeatherServer server = new WeatherServer();
Observer userZhang = new User("zhangsan");
Observer userLi = new User("lisi");
Observer userWang = new User("wangwu");
server.registerObserver(userZhang);
server.registerObserver(userLi);
server.registerObserver(userWang);
server.setInfomation("今天有大雨!!!");
System.out.println("----------------------------------------------");
server.removeObserver(userZhang);
server.setInfomation("明天是晴天~~~");
}
}
设计模式-观察者模式
最新推荐文章于 2025-07-04 15:03:43 发布