一、概述
观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。
二、结构
在观察者模式中有如下角色:
- Subject:观察对象,定义了注册观察者和删除观察者的方法。此外,它还声明了“获取现在的状态”的方法。
- ConcreteSubject:具体观察对象,当自身状态发生变化后,它会通知所有已经注册的 Observer 角色。
- Observer:抽象观察者,负责接收来自 Subject 角色的状态变化的通知,为此,它声明了 update 方法。
- ConcrereObserver:具体观察者,当它的 update 方法被调用后,会去获取要观察的对象的最新状态。
三、代码实现
1、Observer
package com.xu.demo.observerPattern;
/**
* 观察者接口
*/
public interface Observer {
void update(String message);
}
2、ConcreteObserver
package com.xu.demo.observerPattern;
/**
* 观察者实例
*/
public class ConcreteObserver implements Observer{
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + ": " + message);
}
}
3、Subject
package com.xu.demo.observerPattern;
/**
* 主题接口
*/
public interface Subject {
//添加订阅者(观察者对象)
void attach(Observer observer);
//删除订阅者
void detach(Observer observer);
//通知订阅者更新消息
void notify(String message);
}
4、SubscriptionSubject
package com.xu.demo.observerPattern;
import java.util.ArrayList;
import java.util.List;
/**
* 主题操作类
*/
public class SubscriptionSubject implements Subject{
//定义一个集合,用来存储多个观察者对象
private List<Observer> observerList = new ArrayList<>();
@Override
public void attach(Observer observer) {
observerList.add(observer);
}
@Override
public void detach(Observer observer) {
observerList.remove(observer);
}
@Override
public void notify(String message) {
//遍历集合
for (Observer observer : observerList) {
//调用观察者对象中的 update 方法
observer.update(message);
}
}
}
5、ObserverPattern
package com.xu.demo.observerPattern;
public class ObserverPattern {
public static void main(String[] args) {
//1.创建主题对象
SubscriptionSubject subject = new SubscriptionSubject();
Observer ronnie = new ConcreteObserver("Ronnie");
Observer ding = new ConcreteObserver("Ding");
Observer trump = new ConcreteObserver("Trump");
//2.观察者订阅主题
subject.attach(ronnie);
subject.attach(ding);
subject.attach(trump);
//3.更新主题
subject.notify("Java专栏更新了!");
System.out.println("====================我是分割线==================");
//4.观察者取消订阅主题
subject.detach(ding);
subject.detach(trump);
//5.更新主题
subject.notify("Python专栏更新了!");
}
}
运行结果:
至此,一个最简单的 发布-订阅 (Publish/Subscribe) 模式代码实例就完成了,大家认真理解好好体会,你也能成为IT高手,我们下回再见。