设计模式之观察者模式

设计模式之观察者模式

观察者模式是对象的行为模式,又叫“发布-订阅模式”。由名字就能够得知,观察这模式构造了一个发布者和订阅者。

观察者模式定义对象之间的一对多依赖关系,以便当一个对象更改状态时,将自动通知和更新其所有依赖项。在观察者模式中,主动发生改变的是发布者称为主题,而被动收到发布者信息的订阅者称为观察者对象,可以根据需要添加/减少具体主题的观察者,实现主题和观察者之间的松耦合。

应用场景

  • 当设计中有两种不同方面的抽象,并且是有依赖关系的,这时将两个抽象分别封装到具体的类中,这样就能够独立的改变和重用这些对象。在观察者模式中两种抽象指的就是抽象主题和抽象观察者。

  • 当一个对象需要更改时,涉及到更改其他类型的其他对象,并且这些对象的数量多且不确定的时候。

  • 当一个对象改变时,其他对象能够得到这个对象已经改变的通知,而不必知道这些对象具体是什么。也就是说要达到这个改变的对象和通知的对象的松耦合。

    所以综上:
    当希望一个对象改变的同时,多个对象能够得到通知,一块进行变更时,可以使用观察者模式对系统设计

模式结构

观察者模式结构图

上图中:

  1. Weather抽象主题类,能够将观察者Observer构成一个list结构,从而能够达到Weather改变的时候可以循环表中的观察者,发送通知。并且作为抽象类实现了添加,移除观察者方法。
  2. BeijingWeather具体主题类,实现了Weather类。
  3. Observer作为抽象观察者类,作为所有观察者的通用接口,其中定义update方法作为更新状态的接口。通过这个接口和Weather类交互来获取状态通知。
  4. WeatherObserverAWeatherObserverB作为具体观察者类,实现类观察者接口。统一接受通知并更新自身状态。

代码

第一部分:抽象主题类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 状态枚举类
public enum WeatherState {
SUNNY_DAY,
CLOUDY_DAY,
RAINY_DAY,
}
// 抽象主题类
public abstract class Weather {

protected WeatherState weatherState;
// 观察者集合
private List<Observer> observerList = new ArrayList<>();

public Weather addObserver(Observer observer){
observerList.add(observer);
return this;
}

public void removeObserver(Observer observer){
observerList.remove(observer);
}

// 通过主题更改从而在该主题上注册的观察者能够同时能到通知
public void notifyObserver(){
for (Observer o:observerList
) {
o.update(this.weatherState);
}
}
}

第二部分:具体主题类

1
2
3
4
5
6
7
8
9
10
public class BeijingWeather extends Weather {

BeijingWeather(WeatherState weatherState) {
this.weatherState = weatherState;
}
//作为更新主题的接口
public void changeState(WeatherState we){
this.weatherState = we;
}
}

第三部分:抽象观察者

1
2
3
4
public interface Observer {
// 更新接口
void update(WeatherState weatherState);
}

第四部分: 具体观察者

1
2
3
4
5
6
public class WeatherObserverA implements Observer {
@Override
public void update(WeatherState weatherState) {
System.out.println("observer A get new weather message is " + weatherState.toString());
}
}

最后调用

1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
// 定义主题
Weather weather = new BeijingWeather(WeatherState.SUNNY_DAY);
//添加观察者
weather.addObserver(new WeatherObserverA()).addObserver(new WeatherObserverB());
//通知所有观察者
weather.notifyObserver();
}
}

结果:最后注册在主题上的所有观察者都收到了通知。

1
2
observer A get new weather message is SUNNY_DAY
observer B get new weather message is SUNNY_DAY
-------------本文结束感谢您的阅读-------------

本文标题:设计模式之观察者模式

文章作者:NanYin

发布时间:2019年06月19日 - 12:06

最后更新:2019年08月12日 - 13:08

原始链接:https://nanyiniu.github.io/2019/06/19/2019-06-24-%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E4%B9%8B%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。