首页 > 其他分享 >6. 前端设计模式之观察者模式

6. 前端设计模式之观察者模式

时间:2023-09-12 20:32:00浏览次数:37  
标签:观察 observer 对象 前端 观察者 observers notify 设计模式

使用观察者模式,我们可以将某些对象(观察者)订阅到另一个对象(可观察对象)。当一个事件发生时,可观察对象会通知它的所有观察者!

这个模式出境的概率就比较高了,无论是在前端还是后端,都能见到它的身影,特别跟事件有关的场景。

从定义看这个模式涉及到两种对象,一种可观察对象也就是观察的目标,一种是观察者对象也叫监听者对象,观察行为的实施者。

首先实现可观察对象:

class Observable {
  constructor() {
    this.observers = [];
  }
 
  subscribe(func) {
    this.observers.push(func);
  }
 
  unsubscribe(func) {
    this.observers = this.observers.filter((observer) => observer !== func);
  }
 
  notify(data) {
    this.observers.forEach((observer) => observer(data));
  }
}

可观察对象内部维护一个数组observers用于存储观察者(其实就是一个函数),提供subcribe把观察者放入到observer数组也就是启用观察,提供unsubscribe把观察者从observer数组中移除也就是取消观察. notify方法用于通知观察者有事件触发了,也就是遍历observers数组执行每一个观察函数。

怎么用呢?现在界面上有两个按钮,我们希望点击这两个按钮都时候都会输出日志并弹出提示信息, 我们可以这样做:

6. 前端设计模式之观察者模式_观察者模式

import React from "react";
import { Button, Switch, FormControlLabel } from "@material-ui/core";
import { ToastContainer, toast } from "react-toastify";
import observable from "./Observable";
//2.当事件发生时 调用notify方法,通知观察者
function handleClick() {
  observable.notify("User clicked button!");
}

function handleToggle() {
  observable.notify("User toggled switch!");
}

function logger(data) {
  console.log(`${Date.now()} ${data}`);
}

function toastify(data) {
  toast(data, {
    position: toast.POSITION.BOTTOM_RIGHT,
    closeButton: false,
    autoClose: 2000
  });
}
//1.使用subscribe注册当事件发生时执行的函数,也就是开启观察
observable.subscribe(logger);
observable.subscribe(toastify);

export default function App() {
  return (
    <div className="App">
      <Button variant="contained" onClick={handleClick}>
        Click me!
      </Button>
      <FormControlLabel
        control={<Switch name="" onChange={handleToggle} />}
        label="Toggle me!"
      />
      <ToastContainer />
    </div>
  );
}

为什么要用观察者模式呢,直接在handleClick和handlerToggler函数里触发

logger和toastify不是一样的效果?!

这样事件的触发逻辑和事件处理逻辑就紧密耦合了。对于简单的场景我们可以直接这样做,但是如果一次事件的触发需要很多不同的操作,并且有时候在我们写代码时还不知道有哪些关注这个事件的对象,这个时候用观察者模式就能很好的解耦被观察对象和观察者,被观察对象不需要知道有多少观察者,只需要简单notify就好,世界是不是突然就简单了很多?!


标签:观察,observer,对象,前端,观察者,observers,notify,设计模式
From: https://blog.51cto.com/u_14256460/7448254

相关文章

  • 编写高质量代码:Web前端开发修炼之道
    编写高质量代码:Web前端开发修炼之道》是一本很实用的Web前端开发书籍。它不仅介绍了如何编写高质量的代码,还提供了一些实践方法和技巧,帮助读者提升自己的Web前端开发技能。无论是初学者还是有一定经验的开发者,都可以从这本书中获得一些有价值的知识和经验。下载:https://pan.quark.c......
  • 前端常用函数及其方法
    前端常用函数及其方法说明:日常开发中需要关注的东西太多了,难免会有些东西容易遗忘,那么好记性不如烂笔头就体现出来了生成一个数组我有一个数字,是根据计算得来的,但是现在我要把它扩展成一个数组constcount=6constarr=Array.from({length:count},(_,index)=>......
  • 前端歌谣-第七课-关于原型
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是原型的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",&......
  • 前端歌谣-第八课-关于面向对象
    前言我是歌谣最好的种树是十年前其次是现在今天继续给大家带来的是面向对象的讲解环境配置npminit-yyarnaddvite-D修改page.json配置端口{"name":"demo1","version":"1.0.0","description":"","main":"index.js",......
  • 设计模式-装饰器模式
    装饰器模式(文章目录)什么是装饰器模式  装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。为什么使用装饰器模式使用装饰者模式有如下好处:  1.避免了类爆炸问题,简化了设计  2.易于扩展,可以灵活组......
  • Android开发中常见的设计模式
    Android开发中常见的设计模式对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是非常有必要的。对于想系统的学习设计模式的同学,这里推荐2本书。一本是HeadFirst系列的HeadH......
  • 软件设计模式系列之三———工厂方法模式
    1模式的定义工厂方法模式是一种常见的设计模式,属于创建型设计模式之一,它在软件工程中用于对象的创建。该模式的主要思想是将对象的创建过程抽象化,将具体对象的实例化延迟到子类中完成,以便在不同情况下可以创建不同类型的对象,而客户端代码不需要知道实际创建的对象类型。2举例......
  • 【23种设计模式】装饰模式(九)
    前言装饰模式,英文名称:DecoratorPattern。我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧,大家一定要看清楚,是“装修”,不是“装饰”。在房子装修的过程中,各种功能可以相互组合,来增加房子的功用。类似的,如果我们在软件系统中,要给某个类型或者对象......
  • 【设计模式】观察者模式Observer:消息的订阅-发布
    (目录)观察者模式是一种非常流行的设计模式,也常被叫作订阅-发布模式。观察者模式在现代的软件开发中应用非常广泛,比如,商品系统、物流系统、监控系统、运营数据分析系统等。常说的基于事件驱动的架构,其实也是观察者模式的一种最佳实践。当观察某一个对象时,对象传递出的每一个行......
  • 5.前端设计模式之容器/展现模式
    Enforceseparationofconcernsbyseparatingtheviewfromtheapplicationlogic通过将视图层和应用逻辑分离实现关注点分离 这个有点像Java应用开发中经常看到的MVC架构模式,实现数据、业务逻辑和展示层分离。这个模式在React中需要两个组件实现:容器组件主要负责获取数据,获取......