新闻中心

J*aScript中的设计模式:单例、观察者模式等_js编程思想

2025-11-03
浏览次数:
返回列表
单例模式确保类仅有一个实例并提供全局访问点,适用于配置管理、日志记录等场景,J*aScript中通过闭包和静态方法实现;观察者模式建立一对多依赖关系,状态变化时自动通知所有观察者,常用于事件系统和组件通信,通过Subject和Observer类实现松耦合。

javascript中的设计模式:单例、观察者模式等_js编程思想

在J*aScript开发中,设计模式是解决常见问题的可复用方案。它们帮助我们写出结构清晰、易于维护和扩展的代码。其中,单例模式和观察者模式是最常用且实用的两种设计模式。下面分别介绍它们的核心思想和实现方式。

单例模式:确保一个类只有一个实例

单例模式的核心是保证某个类在整个应用中只存在一个实例,并提供一个全局访问点。这在需要共享资源或控制对象创建频率时非常有用,比如配置管理、日志记录器或数据库连接池。

在J*aScript中,由于没有类的私有构造函数,我们通过闭包和静态属性模拟单例行为:

const Singleton = (function () {
  let instance;

  function createInstance() {
    return { name: 'Singleton Instance' };
  }

  return {
    getInstance: function () {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    }
  };
})();

// 使用
const obj1 = Singleton.getInstance();
const obj2 = Singleton.getInstance();
console.log(obj1 === obj2); // true

上面的代码利用立即执行函数(IIFE)创建了一个私有作用域,instance变量无法被外部直接访问,只能通过getInstance方法获取唯一实例。这种方式有效防止了重复创建对象。

观察者模式:实现对象间的松耦合通信

观察者模式定义了一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知。这种模式常用于事件系统、数据绑定和状态管理等场景。

在该模式中,有两个核心角色:主题(Subject)观察者(Observer)。主题负责维护观察者列表,并在状态变化时通知它们。

OneStory OneStory

OneStory 是一款创新的AI故事生成助手,用AI快速生成连续性、一致性的角色和故事。

OneStory 319 查看详情 OneStory
class Subject {
  constructor() {
    this.observers = [];
  }

  addObserver(observer) {
    this.observers.push(observer);
  }

  removeObserver(observer) {
    this.observers = this.observers.filter(obs => obs !== observer);
  }

  notify(data) {
    this.observers.forEach(observer => observer.update(data));
  }
}

class Observer {
  constructor(name) {
    this.name = name;
  }

  update(data) {
    console.log(`${this.name} received:`, data);
  }
}

// 使用示例
const subject = new Subject();
const observer1 = new Observer('Observer A');
const observer2 = new Observer('Observer B');

subject.addObserver(observer1);
subject.addObserver(observer2);

subject.notify('State changed!'); 
// 输出:
// Observer A received: State changed!
// Observer B received: State changed!

这个实现让多个观察者可以动态订阅或取消订阅主题,实现了发布-订阅机制,降低了模块之间的耦合度。

实际应用场景建议

单例模式适合用于:

  • 全局配置管理器
  • 日志服务
  • 缓存实例(如localStorage封装)

观察者模式适用于:

  • 自定义事件系统
  • 组件间通信(如Vue的$emit/$on)
  • 状态管理雏形(类似Redux的监听机制)

合理使用这些模式能提升代码组织性,但也要避免过度设计。例如,简单的项目可能不需要手动实现完整的观察者模式,可以直接使用浏览器原生的EventTarget或现代框架提供的响应式系统。

基本上就这些。掌握这两种模式的本质,有助于理解更复杂的架构设计。

以上就是J*aScript中的设计模式:单例、观察者模式等_js编程思想的详细内容,更多请关注其它相关文章!


# 也要  # 辽阳哪个网站推广好  # 成都消防网站建设  # 上海品牌网站建设公  # 钟楼区网站优化渠道  # seo收录情况  # 闵行抖音seo厂家  # 光山优化网络推广营销  # 数据推广怎么做好营销  # 最好的律师推广网站  # 大悟网站推广  # 相关文章  # 并在  # 两种  # 不需要  # vue  # 多个  # 记录器  # 配置管理  # 适用于  # 复用  # red  # javascript开发  # 作用域  # 常见问题  # 浏览器  # js  # java  # javascript 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Django模型中自动计算可用余额的实现方法  win11专注助手在哪 Win11免打扰模式设置与自动化规则【指南】  Win11怎么开启省电模式_Win11电池节电模式自动开启  c++中的std::forward_list和std::list有什么不同_c++ forward_list与list区别分析  铃兰之剑为这和平的世界希里技能组及加点推荐  如何设置Windows Defender的定时扫描_计划任务实现自动杀毒【安全】  UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS  Animex动漫社网入口地址 Animex动漫社网正版在线入口  极速漫画官方主页网址 极速漫画漫画在线浏览官网链接  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  AI泡沫首次被“刺破”:GPU十年都无法存活!  解决Tabulator日期时间排序问题的专业指南  KFC早餐时段怎么领特惠代码_KFC早餐订餐优惠代码获取与使用说明  Win11蓝牙耳机断连怎么解决 Win11蓝牙设置重新配对与驱动更新【技巧】  PHP表单数据传递:如何通过隐藏输入字段获取动态ID  印象笔记怎样用批量导出备知识库_印象笔记用批量导出备知识库【备份方法】  TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法  Yandex免登录网页版地址 Yandex搜索引擎官方访问入口  12306选座怎么选到特殊座位_12306特殊座位选择注意事项  使用Pandas转换并合并DataFrame:多列映射至统一结构  Windows电脑怎么截图最方便_系统自带截图工具的5种神仙用法【技巧】  j*a toString()的覆盖  AO3中文官网链接_AO3网页版稳定镜像站  Python大型XML文件高效流式解析教程  Yandex官网免登录入口_俄罗斯Yandex搜索引擎一键访问  CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色  c++如何使用chrono库处理时间_c++标准库时间与日期操作  蛙漫限时开放最深处链接_蛙漫全站漫画会员同款秒开地址  mysql备份恢复性能优化_mysql备份恢复性能优化方法  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  抖音网页版平台入口 抖音网页版官网在线访问教程  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  绝地鸭卫平a核爆刀流玩法攻略  CSS图片焦点样式实现教程:理解与应用tabindex属性  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  痛风发作了怎么办? 快速止痛和后期饮食调理  Go语言中JSON数据解码与字段访问指南  Windows 11怎么彻底关闭定位_Windows 11服务中禁用Geolocation  怎么在mac上运行html代码_mac运行html代码方法【指南】  AO3镜像入口大全 AO3网页版内容访问全集  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧  为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法  QQ邮箱正确登录入口_QQ邮箱官方网站使用地址  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  Win11网速慢怎么解决 Win11网络设置优化解除限速 

搜索