观察者模式

作者: hangzhi | 来源:发表于2020-06-04 12:40 被阅读0次
  • 定义:
    指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
  • 特点:
    • 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。(优点)
    • 目标与观察者之间建立了一套触发机制。(优点)
    • 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。(缺点)
    • 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。(缺点)
  • 通常适用场景:
    • 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
    • 当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • demo代码:
    • 主题
    public class Subject {
          
          private List<Observer> observers = new ArrayList<>();
          
          private int state;
          
          public int getState() {
              return state;
          }
          public void setState(int state) {
              this.state = state;
              notifyAllObservers();
          }
          public void add(Observer observer) {
              observers.add(observer);
          }
          public void remove(Observer observer) {
              observers.remove(observer);
          }
          public void notifyAllObservers() {
              for (Observer observer : observers) {
                  observer.update();
              }
          }
      }
    
    • 抽象观察者和具体观察者
    //抽象观察者
      public abstract class Observer {
          protected Subject subject;
          public abstract void update();
      }
    
      //具体观察者
      public class BinaryObserver extends Observer {
          public BinaryObserver(Subject subject) {
              this.subject = subject;
              this.subject.add(this);
          }
          @Override
          public void update() {
              String result = Integer.toBinaryString(subject.getState());
              System.out.println("数据处理为二进制值为:" + result);
          }
      }
      public class HexaObserver extends Observer {
          public HexaObserver(Subject subject) {
              this.subject = subject;
              this.subject.add(this);
          }
          @Override
          public void update() {
              String result = Integer.toHexString(subject.getState()).toUpperCase();
              System.out.println("数据处理为十六进制值为:" + result);
          }
      }
    
    
    • 测试
    public static void main(String[] args) {
          Subject subject =new Subject();
          new BinaryObserver(subject);
          new HexaObserver(subject);
          subject.setState(100);
      }
    

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

    本文标题:观察者模式

    本文链接:https://www.haomeiwen.com/subject/lkclahtx.html