JS设计模式学习存档

2022-02-21  本文已影响0人  米卡卡米
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <button id="add">
        xxxxxssjkskjskj
    </button>
</body>

<script>
    // 策略模式 以下代码改造权限判断。---抛弃if else
    //开放封闭原则:软件实体应该是可扩展,而不可修改的。
    //也就是说,对扩展是开放的,而对修改是封闭的。
    //策略
    const jobList = ['YK', 'QD']
    var strategies = {
        //查看角色
        checkRole: function (value) {
            return value === 'juejin';
        },
        //查看等级
        checkGrade: function (value) {
            return value >= 1
        },
        checkJob: (value) => {
            return jobList.indexOf(value) > 1
        }
    }
    //添加策略事件
    var Validator = function () {
        this.cache = [];
        this.add = function (value, method) {
            this.cache.push(function () {
                return strategies[method](value);
            })
        }
        //检查
        this.check = function () {
            for (let i = 0; i < this.cache.length; i++) {
                let valiFn = this.cache[i];
                var data = valiFn();
                if (!data) {
                    return false
                }
            }
            return true;
        }
    }
    //开始检查权限
    var compose1 = function () {
        var validator = new Validator();
        const data1 = {
            role: 'juejin',
            grade: 3
        }
        validator.add(data1.role, 'checkRole')
        validator.add(data1.grade, 'checkGrade')
        const result = validator.check();
        return result
    }
    //输出结果:ture or false
    console.log(compose1())
    //---策略模式结束
    //发布--订阅模式  中间放了一个盒子,发布到盒子里,订阅的去盒子里找对应的内容。
    //1.相互独立、2.存在一对多关系、3.依赖模块不稳定。4.团队各自开发。
    const EventEmit = function () {
        this.events = {};
        //定义
        this.on = function (name, cb) {
            console.log(this.events[name])
            if (this.events[name]) {
                this.events[name].push(cb);

                console.log('if')
            }
            else {
                this.events[name] = [cb]
                console.log('else')
            }
        }
        //触发
        this.trigger = function (name, ...cb) {
            if (this.events[name]) {
                this.events[name].forEach(element => {
                    element(...cb)
                });
            }
        }
    }
    //使用
    let event = new EventEmit();
    event.on('success', () => {
        console.log('更新')
    })
    event.on('success', () => {
        console.log('更新2')
    })
    event.trigger('success')
    ////----发布、订阅模式结束

    ////装饰器模式 允许向一个对象添加新的功能,但是不改变其结构。
    class Player {
        constructor(name) {
            this.name = name;
        }
        //自我介绍
        sayName() {
            console.log('my name is ' + this.name)
        }
        //我的武器只有我的拳头
        fire() {
            console.log('i can only punch!')
        }
    }
    //构造一把枪
    class gun {
        constructor(player) {
            player.fire = this.fire
        }
        fire() {
            console.log('i shoot with my pistol!')
        }
    }

    //使用
    const player = new Player('mika')
    player.sayName()
    player.fire()
    const playwithgun = new gun(player)
    playwithgun.fire()

    //装饰者模式结束==
    //代理模式:代理模式是为一个对象提供一个代用品或占位符,以便控制对它的访问。排除掉一些不必要的访问请求
    //https://plc.jj20.com/up/allimg/911/050916125K7/160509125K7-11.jpg

    //虚拟代理-图片预加载
    var myImage = (function () {
        var imgNode = document.createElement('img');
        document.body.appendChild(imgNode);
        return {
            setSrc: function (src) { imgNode.src = src }
        }
    })()
    //创建代理 预加载loading
    var proxyImage = (function () {
        var img = new Image;
        img.onload = function () {
            myImage.setSrc(this.src)
        }
        return {
            setSrc: function (src) {
                myImage.setSrc('./logo.gif');
                img.src = src
            }
        }
    })();
    proxyImage.setSrc('http://question.museum24h.com/zy/static/img/1-3-2.21c5091.jpg')



    //防抖-学习 
    let btn = document.getElementById('add')
    btn.addEventListener('click', debounce(addOne, 2000))
    function addOne() {
        console.log('add')
    }
    function debounce(fun) {
        console.log(';??我被点击了')
        let timer = null;
        return function () {
            clearTimeout(timer)
            timer = setTimeout(() => {
                console.log('??')
                fun()
            }, 1000)
        }
    }
</script>

</html>

上一篇 下一篇

猜你喜欢

热点阅读