设计模式--观察者模式
观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
观察者模式是一种对象行为型模式,其主要优点如下。
- 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
- 目标与观察者之间建立了一套触发机制。
它的主要缺点如下。
- 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。
选责任链吧B?
- 被观察者(Subject)具有注册和移除观察者、并通知所有观察者的功能,(Subject)是通过维护一张观察者列表来实现这些操作的。
- 观察者(Observer)的注册功能需要调用被观察者的 registerObserver() 方法。
//只要实现了接口 相应的类也都需要实现
public interface Subject {
//注册
void registerObserver(Observer o);
//移除
void removeObserver(Observer o);
//通知
void notifyObserver();
}
public interface Observer {
void update(float temp, float humidity, float pressure);
}
public class WeatherData implements Subject {
//用一张list<观察者>链表来存储,需要被通知的观察对象
private List<Observer> observers;
private float temperature;
private float humidity;
private float pressure;
//构造函数 创建被观察者weatherdata天气数据 同时创建一个观察者链表
public WeatherData() {
observers = new ArrayList<>();
}
//set修改update了数据后 就通知list链表中的所有观察者
public void setMeasurements(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
this.pressure = pressure;
notifyObserver();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
int i = observers.indexOf(o);
if (i >= 0) {
observers.remove(i);
}
}
@Override
public void notifyObserver() {
for (Observer o : observers) {
o.update(temperature, humidity, pressure);
}
}
}
public class StatisticsDisplay implements Observer {//统计显示
//构造方法 注册
public StatisticsDisplay(Subject weatherData) {
weatherData.reisterObserver(this);
}
@Override
public void update(float temp, float humidity, float pressure) {
System.out.println("StatisticsDisplay.update: " + temp + " " + humidity + " " + pressure);
}
}
public class CurrentConditionsDisplay implements Observer {//目前情况显示
public CurrentConditionsDisplay(Subject weatherData) {
weatherData.registerObserver(this);
}
@Override
public void update(float temp, float humidity, float pressure) {
System.out.println("CurrentConditionsDisplay.update: " + temp + " " + humidity + " " + pressure);
}
}
public class WeatherStation {//气象站
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
//观察者(被通知对象)需要有一个有参的构造方法(传入被观察者) 与被观察者进行绑定
CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
weatherData.setMeasurements(0, 0, 0);
weatherData.setMeasurements(1, 1, 1);
}
}
观察者模式主要是要实现观察者在被观察者对象中完成注册的动作
public class Test {
public static void main(String[] args) {
WechatServer server = new WechatServer();
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("PHP是世界上最好用的语言!");
System.out.println("----------------------------------------------");
server.removeObserver(userZhang);
server.setInfomation("JAVA是世界上最好用的语言!");
}
}
还没有评论,来说两句吧...