设计模式-观察者模式

超、凢脫俗 2022-01-19 23:53 377阅读 0赞

观察者模式

引言

今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。

正文

观察者模式是指多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都会收到它的通知,然后做出改变。

核心思想

通过对目标和观察者之间建立了一套触发机制,降低了两者间的耦合关系,因为这两者仅仅都是抽象耦合。

代码实现

讲解

  1. //抽象观察者
  2. public interface Observer {
  3. void response();
  4. }
  5. 复制代码
  6. //抽象目标
  7. public abstract class Subject {
  8. protected List<Observer> observers = new ArrayList<>();
  9. public void add(Observer observer) {
  10. observers.add(observer);
  11. }
  12. public void remove(Observer observer) {
  13. observers.remove(observer);
  14. }
  15. //通知
  16. public abstract void notifyObserver();
  17. }
  18. 复制代码
  19. //具体目标
  20. public class ConcreteSubject extends Subject {
  21. @Override
  22. public void notifyObserver() {
  23. System.out.println("此时发生了一些变化...");
  24. for (Object obj : observers) {
  25. ((Observer) obj).response();
  26. }
  27. }
  28. }
  29. 复制代码
  30. //具体观察者
  31. public class ConcreteObserver implements Observer {
  32. @Override
  33. public void response() {
  34. System.out.println("具体观察者对变化作出反应");
  35. }
  36. }
  37. 复制代码

实例

  1. //抽象交通信号灯类(目标)
  2. public abstract class TrafficLights {
  3. protected List<Driver> drivers = new ArrayList<>();
  4. public void add(Driver driver) {
  5. drivers.add(driver);
  6. }
  7. public void remove(Driver driver) {
  8. drivers.remove(driver);
  9. }
  10. public abstract void notifyDriver();
  11. }
  12. 复制代码
  13. public class RedLight extends TrafficLights {
  14. @Override
  15. public void notifyDriver() {
  16. System.out.println("红灯变成绿灯了...");
  17. for (Driver driver : drivers) {
  18. driver.response();
  19. }
  20. }
  21. }
  22. 复制代码
  23. //司机接口(观察者)
  24. public interface Driver {
  25. void response();
  26. }
  27. 复制代码
  28. public class MeDriver implements Driver {
  29. @Override
  30. public void response() {
  31. System.out.println("红灯告诉我变成绿灯了,我得开车走了");
  32. }
  33. }
  34. 复制代码
  35. //调用
  36. public class Main {
  37. public static void main(String[] args) {
  38. TrafficLights redLight = new RedLight();
  39. MeDriver meDriver = new MeDriver();
  40. redLight.add(meDriver);
  41. redLight.notifyDriver();
  42. }
  43. }
  44. 复制代码

输出结果

  1. 红灯变成绿灯了...
  2. 红灯告诉我变成绿灯了,我得开车走了
  3. 复制代码

总结

观察者模式很好的处理了一对多对象之间的耦合关系,但并没有完全解除之间的依赖关系,处理不好可能会造成循环引用,同时如果观察者对象过多时,通知的发布会效率变低(参考一个高速堵车)。

发表评论

表情:
评论列表 (有 0 条评论,377人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-观察模式

    观察者模式 引言 > 今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。 正文 观察者模式是指多

    相关 设计模式-观察模式

    观察者模式也叫订阅发布模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    相关 设计模式——观察模式

      观察者模式——定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。   观察者

    相关 设计模式:观察模式

    一.简介 > QT的信号槽就是观察者模式,当事件发生之后(比如按钮被点击)就会发出一个信号,这种信号类似广播没有目的.当对象对信号感兴趣,就会通过 connect() 函

    相关 设计模式--观察模式

    定义 在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。 其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消