IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> js设计模式之观察者模式 -> 正文阅读

[JavaScript知识库]js设计模式之观察者模式

什么是观察者模式?

? ? ? ? 观察者模式是一对多的一种依赖关系,让多个观察者对象同时监听某一个主体对象。这个主体发生状态的时候。会通知所有的观察者对象,自动更新自己的状态。

? ? ? ? 而发布订阅者模式,则不同。发布订阅者模式是一种多对多的依赖关系。通过事件的绑定,通知给需要接受的订阅者,让订阅者更新自己的状态。

? ? ? ? 两种之间的区别在于观察者模式知道自己所派发的目标对象是谁。而发布订阅者模式观察者和订阅者之间不清楚对方是谁。是由中间层进行交互完成派发任务。

写一个通过输入对应的字母的案例

<body>
    <input>
    <p>A</p>
    <p>B</p>
    <p>C</p>
    <p>数字</p>
</body>

通过input框中输入的值。通过addEventListener来监听每次输入的值来是否让对应的字母进行高亮显示。

<script>
    let inp = document.querySelector('input')
    var A = document.querySelector('#A');
    var B = document.querySelector('#B')
    var C = document.querySelector('#C')
    var num = document.querySelector('#num')
    
    inp.addEventListener('input', function () {
        A.classList.toggle('active', this.value.indexOf('A') !== -1)
        B.classList.toggle('active', this.value.indexOf('B') !== -1)
        C.classList.toggle('active', this.value.indexOf('C') !== -1)
        num.classList.toggle('active', /\d/.test(this.value))
    })
</script>

那么接下来通过面向对象的方式,将这块重新编写一边。

<script>
    class inp {
        // 在构造函数里面编写属性
        constructor(el) {
            this.observers = [];
            // 通过监听input框的变化将变化的值传给所有的观察者
            el.addEventListener('input', (e) => {
                this.allNotify(e.target.value)
            })
        }
        allNotify(value) {
            this.observers.forEach(item => {
                item.notify(value)
            })
        }
        addObserver(ob) {
            this.observers.push(ob)
        }
    }

    // DocumentFragment对象 一般动态创建html元素都需要创建好添加到html会导致页面回流,
    // DocumentFragment对象是通过一次性将子孙节点添加进。因此性能会有效的提高
    class observer extends DocumentFragment {
        constructor(txt) {
            super()
            // 在每次new一个的时候创建对应的节点
            this.p = document.createElement('p');
            this.p.innerHTML = txt
            document.querySelector('body').append(this.p)
        }
        // 通过匹配到对应的字符出现对应的方法
        notify(value) {
            this.p.classList.toggle('active', this.handle(value))
            console.log(this.handle(value));
        }
    }


    class alphabet extends observer {
        constructor(txt) {
            super(txt)
            this.txt = txt
        }
        handle(value) {
            // 当每次变化的值indexOf不为-1说明有相对应的值
            return value.indexOf(this.txt) !== -1
        }
    }

    class num extends observer {
        constructor(txt) {
            super(txt)
            this.txt = txt
        }
        handle(value) {
            // 通过正则来判断是否有数字
            return /\d/.test(this.txt)
        }
    }
    const inpK = new inp(document.querySelector('input'));
    inpK.addObserver(new alphabet('A'))
    inpK.addObserver(new alphabet('B'))
    inpK.addObserver(new alphabet('C'))
    inpK.addObserver(new num('数字'))
</script>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:26:58  更:2021-10-25 12:29:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 9:51:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码