描述

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。对象行为型模式
image.png

主要角色

  • Subject: 目标
  • ConcreteSubject: 具体目标
  • Observer: 观察者
  • ConcreteObserver: 具体观察者

代码实现

  1. 观察者
  2. public abstract class AbstractAnchor {
  3. abstract void addFan(AbstractFan fan);
  4. }
  1. public class LshadAnchor extends AbstractAnchor {
  2. private List<AbstractFan> fans = new ArrayList<>();
  3. public void startBroadcast() {
  4. System.out.println("开播了 通知粉丝");
  5. for (AbstractFan fan : fans) {
  6. fan.notificationCallback();
  7. }
  8. }
  9. public void downcast() {
  10. System.out.println("下播了 通知粉丝");
  11. for (AbstractFan fan : fans) {
  12. fan.notificationCallback();
  13. }
  14. }
  15. @Override
  16. void addFan(AbstractFan fan) {
  17. fans.add(fan);
  18. }
  19. }
  1. public abstract class AbstractFan {
  2. abstract void subscribeToTheHost(AbstractAnchor abstractAnchor);
  3. abstract void notificationCallback();
  4. }
  1. public class HumanFans extends AbstractFan{
  2. @Override
  3. void subscribeToTheHost(AbstractAnchor abstractAnchor) {
  4. abstractAnchor.addFan(this);
  5. }
  6. @Override
  7. void notificationCallback() {
  8. System.out.println("呸...");
  9. }
  10. }
  1. public class RobotFans extends AbstractFan{
  2. @Override
  3. void subscribeToTheHost(AbstractAnchor abstractAnchor) {
  4. abstractAnchor.addFan(this);
  5. }
  6. @Override
  7. void notificationCallback() {
  8. System.out.println("来了臭弟弟");
  9. }
  10. }
  1. public class ObserverTest {
  2. public static void main(String[] args) {
  3. LshadAnchor lshadAnchor = new LshadAnchor();
  4. HumanFans humanFans = new HumanFans();
  5. RobotFans robotFans = new RobotFans();
  6. humanFans.subscribeToTheHost(lshadAnchor);
  7. robotFans.subscribeToTheHost(lshadAnchor);
  8. lshadAnchor.startBroadcast();
  9. lshadAnchor.downcast();
  10. }
  11. }
  12. //测试结果
  13. 开播了 通知粉丝
  14. 呸...
  15. 来了臭弟弟
  16. 下播了 通知粉丝
  17. 呸...
  18. 来了臭弟弟

使用场景

什么场景用到?

  • Spring事件机制如何实现?
  • Vue的双向绑定核心响应式编程核心思想
  • ……