升职加薪必备技能:设计模式之——观察者模式

基本介绍

观察者模式属于行为型设计模式的一种。该模式的主要作用是定义了对象之间一对多的依赖关系。当“一”的一方发生改变时会自动通知给每一位依赖者。

简单来说我们可以将该模式理解成一个社区的“居委会”,每位居民都依赖于居委会,当有什么消息时居委会将通知给每位居民。

相信通过这个简单的小例子我们可以看出,观察者模式是站在易用和低耦合的前提下,保证所有依赖者可以收到被依赖一方的改变。

UML类图讲解

在这里插入图片描述

类图讲解

Subject:抽象主题(抽象被观察者),可以对比上文理解成抽象的居委会。接口中定义了新增、删除观察者和通知消息给所有观察者的方法。
ConcreteSubject:具体主题(被观察者),也就是具体的居委会。该类实现了抽象主题,并且还聚合了所有观察者。
Observer:抽象观察者,可以对比上文理解为抽象的居民。接口中定义了一个更新方法,该方法用于在接收到主题的通知后进行更新。
ConcreteObserverA/B:具体的观察者。该类实现了抽象观察者,并具体实现了其中定义的方法。
Client:客户端测试类。

案例讲解

案例:居委会发送消息给每位居民。

观察者接口

public interface Observer {

  // 更新消息
  void update(String msg);

}

居民相关类 =>具体观察者

/**
 * 居民A
 */
public class InhabitantA implements Observer {

  // 消息
  private String msg;

  @Override
  public void update(String msg) {
    this.msg = msg;
    System.out.println("居民A收到的最新消息:" + this.msg);
  }
}

/**
 * 居民B
 */
public class InhabitantB implements Observer {

  // 消息
  private String msg;

  @Override
  public void update(String msg) {
    this.msg = msg;
    System.out.println("居民B收到的最新消息:" + this.msg);
  }
}

主题接口

public interface Subject {

  // 注册观察者
  void registerObserver(Observer observer);

  // 删除观察者
  void removerObserver(Observer observer);

  // 通知所有观察者
  void notifyObservers();
}

居委会 => 对应具体主题角色

public class NeighborhoodCommittee implements Subject {

  // 消息
  private String msg;

  // 观察者集合
  private List<Observer> observers;

  public NeighborhoodCommittee() {
    this.observers = new ArrayList<>();
  }

  // 更新消息
  public void updateMsg(String msg) {
    this.msg = msg;
    this.notifyObservers();
  }

  @Override
  public void registerObserver(Observer observer) {
    this.observers.add(observer);
  }

  @Override
  public void removerObserver(Observer observer) {
    if (this.observers.contains(observer)) {
      this.observers.remove(observer);
    }
  }

  @Override
  public void notifyObservers() {
    for (Observer observer : this.observers) {
      observer.update(this.msg);
    }
  }
}

客户端

public class Client {

  public static void main(String[] args) {
    // 创建居委会
    NeighborhoodCommittee nc = new NeighborhoodCommittee();
    // 创建居民
    InhabitantA inhabitantA = new InhabitantA();
    InhabitantB inhabitantB = new InhabitantB();

    // 注册用户
    nc.registerObserver(inhabitantA);
    nc.registerObserver(inhabitantB);

    // 更新消息
    nc.updateMsg("点赞、关注小菜鸟!");
  }
}

执行结果

在这里插入图片描述

总结

1、观察者模式将主题和观察者之间的依赖提升到抽象层。

2、观察者模式在主题中通过集合管理所有观察者,并提供注册和删除的方法。当新增或删除观察者时就不需要修改原有的代码,只要调用相应的方法即可。这样的模式符合ocp原则。

3、观察者模式将观察者和被观察者(主题)进行了分离,从而提高了程序的可维护性和重用性。

4、如果一个主题有很多观察者,那么将更新的内容通知给所有观察者时将花费很多时间。

5、观察者和主题之间如果存在循环依赖的话会造成系统崩溃。

6、主题更新内容进行通知时尽量采用异步方法,避免同步更新时因某一观察者出错而导致整个通知中断。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值