js的设计模式

单例模式-应用

  function Msg(){
        this.ele = document.createElement("div");
        document.body.appendChild(this.ele);
    }
    Msg.prototype.init = function(str){
        this.ele.innerHTML = str;
    }
    var singleCase = (function (){
        var instance;
        return function(text){
            if(!instance){
                instance = new Msg();
            }
            instance.init(text);
            return instance;
        }
    })();
    var m1 = singleCase("hello");
    var m2 = singleCase("world");
    console.log(m1===m2);

组合模式:

 class GoHome{
        init(){
            console.log("到家了,开门");
        }
    }
    class OpenComputer{
        init(){
            console.log("开电脑");
        }
    }
    class OpenXiaoAi{
        init(){
            console.log("开音乐");
        }
    }
    // 组合器,用来组合功能
    class Comb{
        constructor(){
            // 准备容器,用来防止将来组合起来的功能
            this.skills = [];
        }
        // 用来组合的功能,接收要组合的对象
        add(task){
            // 向容器中填入,将来准备批量使用的对象
            this.skills.push(task);
        }
        // 用来批量执行的功能
        action(){
            // 拿到容器中所有的对象,才能批量执行
            this.skills.forEach( val => {
                val.init();
            } );
        }
    }
    var c = new Comb();
    // 提前将,将来要批量操作的对象,组合起来
    c.add( new GoHome() );
    c.add( new OpenComputer() );
    c.add( new OpenXiaoAi() );
    // 等待何时的时机,执行组合器的启动功能
    c.action();

观察者模式:

  function Observer(){
        // {
        //     click:[fn1,fn2,fn3],
        //     mousedown:[fn4,fn5,fn6]
        // }
        this.msg = {};
    }
    // 向小本本中添加事件,消息
    Observer.prototype.on = function(type, cb){
        // 判断有没有当前传进来的这个类型
        // 如何没有,走else
        if(this.msg[type]){
            // 如果有,直接给第一次设置的这个数组,添加个新数据
            this.msg[type].push(cb);
        }else{
            // 给他设置一个对应的属性,同时,属性值需要提前写成数组
            this.msg[type] = [cb];
        }
        console.log(this.msg);
    }
    Observer.prototype.emit = function(type){
        // 首先判断是不是已经记录
        if(this.msg[type]){
            var event = {
                type:type
            }
            // 如果已经记录了信息,那么就去执行这个消息对应的所有的处理函数
            this.msg[type].forEach(val=>{
                val.call(this,event);
            })
        }
    }
    Observer.prototype.off = function(type, cb){
        // 首先判断是不是已经记录
        if(this.msg[type]){
            // 准备保存符合传参的处理函数的索引
            var i = 0;
            // 遍历,判断,当前类型对应的每一个处理函数,依次作比较
            var onoff = this.msg[type].some((val, idx)=>{
                i = idx;
                return val === cb;
            })
            // 判断是否获取到重复的函数
            if(onoff){
                // 如果有,那么就在当前的消息处理函数的队列中,删除这个函数
                this.msg[type].splice(i, 1);
            }
        }
    }
    // 首先创建一个观察者对象
    var ob = new Observer();
    // 准备两个处理函数
    function a(){
        console.log("没收");
        console.log(this);
    }
    function b(){
        console.log("叫家长");
    }
    // 随便绑定一个消息,给了两个处理函数
    ob.on("玩手机",a);
    ob.on("玩手机",b);

    // 模拟事件的执行
    ob.emit("玩手机");

    // 删除一个处理函数
    ob.off("玩手机", b);

    // 模拟事件的执行
    ob.emit("玩手机");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值