描述
观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。对象行为型模式
主要角色
- Subject: 目标
- ConcreteSubject: 具体目标
- Observer: 观察者
- ConcreteObserver: 具体观察者
代码实现
观察者
public abstract class AbstractAnchor {
abstract void addFan(AbstractFan fan);
}
public class LshadAnchor extends AbstractAnchor {
private List<AbstractFan> fans = new ArrayList<>();
public void startBroadcast() {
System.out.println("开播了 通知粉丝");
for (AbstractFan fan : fans) {
fan.notificationCallback();
}
}
public void downcast() {
System.out.println("下播了 通知粉丝");
for (AbstractFan fan : fans) {
fan.notificationCallback();
}
}
@Override
void addFan(AbstractFan fan) {
fans.add(fan);
}
}
public abstract class AbstractFan {
abstract void subscribeToTheHost(AbstractAnchor abstractAnchor);
abstract void notificationCallback();
}
public class HumanFans extends AbstractFan{
@Override
void subscribeToTheHost(AbstractAnchor abstractAnchor) {
abstractAnchor.addFan(this);
}
@Override
void notificationCallback() {
System.out.println("呸...");
}
}
public class RobotFans extends AbstractFan{
@Override
void subscribeToTheHost(AbstractAnchor abstractAnchor) {
abstractAnchor.addFan(this);
}
@Override
void notificationCallback() {
System.out.println("来了臭弟弟");
}
}
public class ObserverTest {
public static void main(String[] args) {
LshadAnchor lshadAnchor = new LshadAnchor();
HumanFans humanFans = new HumanFans();
RobotFans robotFans = new RobotFans();
humanFans.subscribeToTheHost(lshadAnchor);
robotFans.subscribeToTheHost(lshadAnchor);
lshadAnchor.startBroadcast();
lshadAnchor.downcast();
}
}
//测试结果
开播了 通知粉丝
呸...
来了臭弟弟
下播了 通知粉丝
呸...
来了臭弟弟
使用场景
什么场景用到?
- Spring事件机制如何实现?
- Vue的双向绑定核心响应式编程核心思想
- ……