基本介绍
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer, Subject通 知Observer变化,Subject,是一的一方。 用户是Observer, 是多的一方。
image.png
例子:
天气预报项目需求,具体要求如下:
- 气象站可以将每天测量到的温度,显度,气压等等以公告的形式发布出去(比如
发布到自己的网站或第三方)。 - 需要设计开放型API,便于其他第三方也能接入气象站获取数据。
- 提供温度、气压和湿度的接口
- 测量数据更新时,要能实时的通知给第三方
public interface Observer {
void update(float a,float b,float c);
}
public interface Subject {
void register(Observer observer);
void remove(Observer observer);
void notifyObservers();
}
public class WeatherData implements Subject{
float a;
float b;
float c;
List<Observer> observers;
public WeatherData() {
this.observers = new ArrayList<Observer>();
}
@Override
public void register(Observer observer) {
// TODO Auto-generated method stub
observers.add(observer);
}
@Override
public void remove(Observer observer) {
// TODO Auto-generated method stub
if (observers.contains(observer)) {
observers.remove(observer);
}
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for(Observer observer : observers){
observer.update(a, b, c);
}
}
public void setData(float a,float b,float c){
this.a = a;
this.b = b;
this.c = c;
notifyObservers();
}
}
public class Baidu implements Observer{
float a;
float b;
float c;
@Override
public void update(float a, float b, float c) {
// TODO Auto-generated method stub
this.a=a;
this.b=b;
this.c =c;
display();
}
private void display() {
// TODO Auto-generated method stub
System.out.println("a指标为:"+a);
System.out.println("b指标为:"+b);
System.out.println("c指标为:"+c);
}
}
public class Client {
public static void main(String[] args) {
WeatherData subject = new WeatherData();
Observer baidu = new Baidu();
subject.register(baidu);
subject.setData(1,2,3);
System.out.println("=============指标进行了更新===========");
subject.setData(4,5,6);
}
}
观察者模式的好处
- 观察者模式设计后,会以集合的方式来管理用户(Observer), 包括注册,移除和通知。
- 这样,我们增加观察者(这里可以理解成一一个新的公告板),就不需要去修改核心类WeatherData不会修改代码,遵守了ocp原则。