一、观察者模式基础
1.什么是观察者模式
观察者模式,也叫发布订阅模式,此种模式通常被用来实现事件处理系统。
观察者模式包含两个概念,一个可观察的主题对象(Subject),一个或多个的观察者(Observer)。或者叫一个消息发布者,多个消息订阅者。
2.观察者模式组成
观察者模式中有四个角色:
- Subject 抽象主题、抽象被观察者
- Concrete Subject 具体主题、具体被观察者
- Observer 抽象观察者
- Concrete Observer 具体观察者
它们的关系如下图
3.各个角色的作用
-
Subject 抽象主题接口定义,供主题发布者实现
-
Observer 抽象观察者接口定义,供具体观察者实现
-
Concrete Subject 提供通知观察者的方法、新增和移除观察者的方法
-
Concrete Observer 提供接口,当主题发布消息时,调用此接口实现具体业务
二、模拟观察者模式代码实现
1.新建Subject主题类
package subjectAndObserver;
import java.util.ArrayList;
import java.util.List;
/**
* 抽象主题者/消息发布者
* */
public class Subject {
private final List<ObserverService> observerList = new ArrayList<>(10);
/**
* 通知观察者
* */
public void notifyObservers(Object message) {
observerList.forEach(observerService -> observerService.doThing(message));
}
/**
* 添加观察者
* */
public void add(ObserverService observer) {
observerList.add(observer);
}
/**
* 移除观察者
* */
public void remove(ObserverService observer) {
observerList.remove(observer);
}
}
2.新建Subject主题具体的实现
package subjectAndObserver;
/**
* 抽象主题者/消息发布者实现类
* */
public class SubjectService extends Subject{
/**
* 发布消息
* */
public void sendMessage(String message){
notifyObservers(message);
}
}
3.新建Observer抽象观察者类
package subjectAndObserver;
/**
* 抽象观察者/消息订阅者
* */
public interface ObserverService {
/**
* 当主题变化时,调用此接口,实现业务
* */
void doThing(Object message);
}
4.新建Observer具体观察者实现类
package subjectAndObserver;
/**
* 抽象观察者/消息订阅者具体实现类
* */
public class ObserverServiceImpl implements ObserverService{
private String name;
public ObserverServiceImpl(String name) {
this.name = name;
}
/**
* 当主题变化时,调用此接口,实现业务
* */
@Override
public void doThing(Object message) {
System.out.println(name + "收到主题发布的消息:" + message + ", 去做某业务");
}
}
5.测试运行
package subjectAndObserver;
public class SubjectAndObserverTest {
public static void main(String[] args) {
SubjectService subject = new SubjectService();
ObserverService observerA = new ObserverServiceImpl("A观察者");
ObserverService observerB = new ObserverServiceImpl("B观察者");
subject.add(observerA);
subject.add(observerB);
System.out.println("观察者和主体的关系建立完成,等待接收主题的消息");
//模拟抽象主题者/消息发布者,发布消息
subject.sendMessage(" 发布商品 ");
subject.sendMessage(" 降价 ");
}
}
运行结果
=========================================================================创作不易,请勿直接盗用,使用请标明转载出处。
喜欢的话,一键三连,您的支持是我一直坚持高质量创作的原动力。