前端设计模式1

135 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

设计模式是一套反复使用多数知晓的、经过分类的、代码设计经验总结

任何事情都有套路,设计模式,就是写代码中常见套路,有些写法我们一直在用

##订阅/发布模式(观察者)

pub/sub 这个应该大家⽤用到最⼴的设计模式了

在这种模式中,并不是一个对象调用另一对象的方法,而是一个对象订阅另一对象特定活动并在状态改变收获得通知,订阅着因此也成为观察者,而被观察者的对象成为发布者或着主题,当发生一个重要事件时候发布者会通知(调用)所有订阅者并且可能经常已事件对象的形式传递消息

class observer {
    constructor() {
        this.observerCache  = {}  // 储存
    }
    $on(name,cb) {
            (this.observerCache[name]||(this.observerCache[name] = [])).push(cb)
    }
    $emit(name,args) {
       if (this.observerCache[name]) {
        this.observerCache[name].forEach(item=>{
            item.call(this,args)
        });
       } else {
           console.warn('observerCache没有相对应的name')
       }
    }
    $off(name) {
        if (this.observerCache[name]) {
            this.observerCache[name] = null;
           } else {
               console.warn('observerCache没有相对应的name')
           }
    }
}

##单例模式

单例模式的定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建在返回,这就是确保一个类只有一个实例对象

适用场景: 一个单一对象,比如弹窗,无论点击多少次,弹窗只应该被创建一次,实现起来也简单,用一个变量缓存即可

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .model-alert {
            background-color: red;
            width: 100px;
            height: 100px;
            position: absolute;
        }
    </style>
</head>
<body>
    <button id='model-btn'>
       一个弹窗
    </button>
    <button id='model-btn1'>
        两个
     </button>
</body>

<script>
    let instance=null;
   function createAlertfn(fn,alertcontent) {
            console.log(instance)
            if (instance) {
                instance.innerHTML = alertcontent
            }
            return instance || (instance = fn.call(this,alertcontent))
            
   }  
   function createAlertHtml(alertcontent) {
       let div = document.createElement('div');
       div.innerHTML = alertcontent||'我是弹窗';
       div.className = 'model-alert';

       if (instance) return
       div.style.display = 'none';
       document.body.append(div);
       return div
   }
    document.getElementById('model-btn').addEventListener('click',() => {
        let div = createAlertfn(createAlertHtml,'我是1')
        console.log(div)
        div.style.display = 'block'
    },false)
    document.getElementById('model-btn1').addEventListener('click',() => {
        let div = createAlertfn(createAlertHtml,'我是2')
        console.log(div)
        div.style.display = 'block'
    },false)
</script>
</html>