概念

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

主要角色

  • Subject: 目标
  • ConcreteSubject: 具体目标
  • Observer: 观察者
  • ConcreteObserver: 具体观察者
  1. /**
  2. * Subject: 目标
  3. */
  4. public abstract class AbstractTikToker {
  5. //添加粉丝
  6. abstract void addFans(AbstractFans fans);
  7. //通知粉丝
  8. abstract void notifyFans(String msg);
  9. }
  1. /**
  2. * ConcreteSubject: 具体目标
  3. */
  4. public class MMTikToker extends AbstractTikToker{
  5. //1、观察者的核心1
  6. List<AbstractFans> fansList = new ArrayList<>();
  7. void startSell() {
  8. System.out.println("雷丰阳... 开始卖货...源码设计课");
  9. notifyFans("我开始卖东西了,是源码设计课,只要666");
  10. }
  11. void endSell() {
  12. System.out.println("雷丰阳... 结束卖货...源码设计课");
  13. notifyFans("课已经卖完了,记得五星好评...");
  14. }
  15. @Override
  16. void addFans(AbstractFans fans) {
  17. fansList.add(fans);
  18. }
  19. //通知所有观察者
  20. @Override
  21. void notifyFans(String msg) {
  22. //1、所有粉丝拿来通知
  23. for (AbstractFans fans : fansList) {
  24. fans.acceptMsg(msg);
  25. }
  26. }
  27. }
  1. /**
  2. * Observer: 观察者
  3. */
  4. public abstract class AbstractFans {
  5. List<AbstractTikToker> tikTokers;//双向观察
  6. abstract void acceptMsg(String msg);
  7. void follow(AbstractTikToker tikToker){
  8. //主播增粉了
  9. tikToker.addFans(this);
  10. // for (AbstractTikToker toker : tikTokers) {
  11. //
  12. // }
  13. };
  14. }
  1. /**
  2. * ConcreteObserver: 具体观察者
  3. */
  4. public class HumanFans extends AbstractFans {
  5. @Override
  6. void acceptMsg(String msg) {
  7. System.out.println("主播说:"+msg);
  8. }
  9. }
  1. /**
  2. * ConcreteObserver: 具体观察者
  3. */
  4. public class RobotFans extends AbstractFans {
  5. @Override
  6. void acceptMsg(String msg) {
  7. System.out.println("呸....");
  8. }
  9. }

应用场景

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