java 在观察者模式中使用泛型T的实例

发布时间 - 2026-01-10 23:11:44    点击率:

被观察者

public class Observable<T> {

  List<Observer> observers = new ArrayList<Observer>();

  boolean changed = false;


  /**
   * Adds the specified observer to the list of observers. If it is already
   * registered, it is not added a second time.
   *
   * @param observer
   *      the Observer to add.
   */
  public void addObserver(Observer observer) {
    if (observer == null) {
      throw new NullPointerException("observer == null");
    }
    synchronized (this) {
      if (!observers.contains(observer))
        observers.add(observer);
    }
  }

  /**
   * Clears the changed flag for this {@code Observable}. After calling
   * {@code clearChanged()}, {@code hasChanged()} will return {@code false}.
   */
  protected void clearChanged() {
    changed = false;
  }

  /**
   * Returns the number of observers registered to this {@code Observable}.
   *
   * @return the number of observers.
   */
  public int countObservers() {
    return observers.size();
  }

  /**
   * Removes the specified observer from the list of observers. Passing null
   * won't do anything.
   *
   * @param observer
   *      the observer to remove.
   */
  public synchronized void deleteObserver(java.util.Observer observer) {
    observers.remove(observer);
  }

  /**
   * Removes all observers from the list of observers.
   */
  public synchronized void deleteObservers() {
    observers.clear();
  }

  /**
   * Returns the changed flag for this {@code Observable}.
   *
   * @return {@code true} when the changed flag for this {@code Observable} is
   *     set, {@code false} otherwise.
   */
  public boolean hasChanged() {
    return changed;
  }

  /**
   * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
   * method for every observer in the list of observers using null as the
   * argument. Afterwards, calls {@code clearChanged()}.
   * <p>
   * Equivalent to calling {@code notifyObservers(null)}.
   */
  public void notifyObservers() {
    notifyObservers(null);
  }

  /**
   * If {@code hasChanged()} returns {@code true}, calls the {@code update()}
   * method for every Observer in the list of observers using the specified
   * argument. Afterwards calls {@code clearChanged()}.
   *
   * @param data
   *      the argument passed to {@code update()}.
   */
  public void notifyObservers(T data) {
    int size = 0;
    Observer[] arrays = null;
    synchronized (this) {
      if (hasChanged()) {
        clearChanged();
        size = observers.size();
        arrays = new Observer[size];
        observers.toArray(arrays);
      }
    }
    if (arrays != null) {
      for (Observer observer : arrays) {
        observer.update(this, data);
      }
    }
  }

  /**
   * Sets the changed flag for this {@code Observable}. After calling
   * {@code setChanged()}, {@code hasChanged()} will return {@code true}.
   */
  protected void setChanged() {
    changed = true;
  }
}

观察者

public interface Observer<T> {
  public void update(Observable<T> observable, T data);
}

以上这篇java 在观察者模式中使用泛型T的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# 观察者模式  # java  # Java设计模式之java观察者模式详解  # Java设计模式之观察者模式(Observer模式)  # Java通俗易懂系列设计模式之观察者模式  # java设计模式之观察者模式学习  # java设计模式之观察者模式  # java和Spring中观察者模式的应用详解  # 给大家  # 希望能  # 这篇  # 小编  # 大家多多  # time  # added  # add  # param  # observer  # Adds  # registered  # list  # void  # Clears  # synchronized  # code  # flag  # null  # addObserver 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Passport实现OAuth2?(完整配置步骤)  Linux系统命令中tree命令详解  如何快速生成ASP一键建站模板并优化安全性?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  使用C语言编写圣诞表白程序  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel怎么清理缓存_Laravel optimize clear命令详解  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel如何处理表单验证?(Requests代码示例)  IOS倒计时设置UIButton标题title的抖动问题  Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何使用.env文件管理环境变量?(最佳实践)  如何彻底删除建站之星生成的Banner?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Python函数文档自动校验_规范解析【教程】  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  网站制作软件免费下载安装,有哪些免费下载的软件网站?  WordPress 子目录安装中正确处理脚本路径的完整指南  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  制作旅游网站html,怎样注册旅游网站?  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  如何用AI一键生成爆款短视频文案?小红书AI文案写作指令【教程】  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲  百度浏览器ai对话怎么关 百度浏览器ai聊天窗口隐藏  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  PHP 500报错的快速解决方法  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  如何快速搭建安全的FTP站点?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  如何利用DOS批处理实现定时关机操作详解  如何注册花生壳免费域名并搭建个人网站?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  Laravel如何升级到最新版本?(升级指南和步骤)  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何用低价快速搭建高质量网站?  香港服务器如何优化才能显著提升网站加载速度?