前端小样

JavaScript 设计模式

2018-06-29  本文已影响0人  小淘气_嘻

设计模式


单例模式

内存泄漏
当一个对象不需要再使用,本该被回收时,受另一个持有它引用的对象影响,导致它不能被回收。
本该被回收的对象不能被回收而停留在堆内存中。
内存泄漏的影响:应用所需的内存超过系统分配的内存限额,内存溢出导致应用Crash

单例模型普通样例: 不同单例在同一命名空间

var demo1= (function(argument){
    var attr1 = function(message){
        this.menling = message;
    };
    var men;
    var obj={
        fun1:function(message){
            if(men){
                men = new attr1(message);
            }
            return men;
        }
    }
    return obj;
})();


var demo2 = {
    fun2 :function(msg){
        var _demo = demo1.fun1(msg);
        alert(_demo);
        _demo = null;    //等待垃圾回收  及时清理存储空间
    }
}

demo2.fun2('didi);

把对应的逻辑封装到对应的区块中,不同命名空间下,减少变量污染

//页面上6个按钮 abcdef
//abc在top命名空间下
//def在banner命名空间下

var top={
    init:function(){ //top的初始化
        this.render();
        this.bind();    
    },
    a:4,  //传递的参数
    render:function(){//把所有DOM元素放进去
        var me = this;
        me.btna = $('#a');
    },
    bind :function(){
        var me = this;
        me.btna.click(function(){
            //业务逻辑
            me.test();
        });
    },
    test:function(){
        a=5;
    }
}
var banner={
    init:function(){ //top的初始化
        this.render();
        this.bind();
    },
    a:4,  //传递的参数 不同命名空间互相保护
    render:function(){//把所有DOM元素放进去
        var me = this;
        me.btna = $('#a');
    },
    bind :function(){
        var me = this;
        me.btna.click(function(){
            //业务逻辑
            me.test();
        });
    },
    test:function(){
        top.a=5;
    }
}

top.init();
banner.init();

构造函数模式 (构建构造函数)

//js开发写单引号
//js必须通过new来让this指向该对象
//PHP实现构造函数模式,关键字

var AA ={
    zaomen:function(huawen){
    if(!(this instanceof zaomen)){ //instanceof 用于检测this是否是zaomen类的一个实例
        return new zaomen();
    }
    this.suo = '普通',
    this.huawen = huawen || '普通' ,
    this.create = function(){
        return '锁头' +this.suo +'花纹'+this.huawen;
    }   
    }   
}
var BB ={
    zaomen:function(huawen){
    if(!(this instanceof zaomen)){ //instanceof 用于检测this是否是zaomen类的一个实例
        return new zaomen();
    }
    this.suo = '普通',
    this.huawen = huawen || '普通' ,
    this.create = function(){
        return '锁头' +this.suo +'花纹'+this.huawen;
    }   
    }   
}


var xiaozhang = AA.zaomen();
console.log(xiaozhang.create());
    
var xiaoli = new BB.zaomen('绚丽');
console.log('xiaoli' + xiaoli.create());

建造者模式

//发送一个请求  白富美
//$.ajax建造者模式,包工头
//工人 完整的工程
$.ajax({
    url:'a.php',
    success:function(){
    }
})

//建造者模式 :按照人、物清晰的逻辑关系来清晰的设计

function Fangzi(){
    this.woshi ='';
    this.keting ='';
    this.chufang = '';
}

function Baogongtou(){
    this.gaifanzi = function(gongren){
        gongren.jian_woshi();
        gongren.jian_keting();
        gongren.jian_chufang();
    }
}

function Gongren(){
    this.jian_woshi = function(){
        console.log('卧室建好了');
    }
    this.jian_keting = function(){
        console.log('客厅建好了');
    }
    this.jian_chufang = function(){
        console.log('厨房建好了');
    }
    this.jiaogong = function(){
            var _fangzi = new Fangzi();
                _fangzi.whoshi ='ok';
                _fangzi.keting ='ok';
                _fangzi.chufang = 'ok';
            return _fangzi;
    }
}

var gongren = new Gongren();
var baogongtou = new Baogongtou();
var baogongtou.gaifangzi(gongren);
var myfangzi = gongren.jiaogong();
console.log(myfangzi);

工厂模式

var gongchang = {};
gongchang.chanyifu = function(){
    this.gongren = 50;
    alert('我们的底线' +this.gongren);
}
gongchang.chanxie = function(){
    alert('产鞋子');
}

gongchang.yunshu = function(){
    alert('运输');
}

gongchang.changzhang = function(para){
    //js用了构造函数模式 以及 单例模式
    return new gongchang[para]();
}

var me = gongchang.changzhang('changyifu');
alert(me.gongren);

让一个工厂分成几个部门,每个部门干自己的事儿 调用时只需要找到这个工厂的这个部分就可以

//简单工厂模式
var XMLHttpFactory = function(){
    
}
XMLHttpFactory.createXMLHttp = function(){
    var XMLHttp = null;
    if(window.XMLHttpRequest){
        XMLHttp = new XMLHttpRequest();
    }elseif(window.ActiveXobject{
        XMLHttp = new ActiveXObject('Microsoft.XMLHttp');
    }
    return XMLHttp;
}

var AjaxHander = function(){
    var XMLHttp = XMLHttpFactory.createXMLHttp();
}

抽象工厂是给你个tag,让你知道这个是什么功能,但是你需要重构丰富他的内容才能使用

//抽象工厂 只留一个,但不做具体的事儿
var XMLHttpFactory = function(){
    
}

XMLHttoFactory.prototype = {
//抛出错误,不能被实例化,只能用来派生子类
    createFactory:function(){
        throw new Error('This is an abstract class');
    }
}
//派生子类

var XHRHandler = function(){
    XMLHttpFactory.call(this);
}
//this发生变化

XHRHandler.prototype = new XMLHttpFactory();
XHRHandler.prototype.constructor = XHRHandler;

XHRHandler.prototype.createFactory = function(){
    var XMLHttp = null;
    if(window.XMLHttpRequest){
        XMLHttp = new XMLHttpRequest();
    }elseif(window.ActiveXobject{
        XMLHttp = new ActiveXObject('Microsoft.XMLHttp');
    }
    return XMLHttp;
}

代理模式(中间件函数进行其他各方,其它各方是相对独立的两个对象)

  1. 远程代理(一个对象将不同空间的对象进行局部代理)
  1. 不能滥用代理
    //代理模式需要有三方

//买家
function maijia(){
    this.name ='小明';
}
//中介卖房
function zhongjie(){}
zhongjie.prototype.maifang = funcrion(){
    new fangdong(new maijia()).maifang('20万');
}
//房东
function fangdong(){
    this.maijianame = maijia.name;
    this.maifang = function(money){
        alert('收到了来自"'+this.maijianame+'"的'+money+'人民币');
    }
}
(new zhongjie).maifang();

命令模式 (传参)

  1. 将函数的封装、请求、调用结合为一体
  1. 不需要接口一致,直接调用函数就好,以免造成浪费
var lian ={};
lian.paobin = function(pao_num){
    alert(pao_num +'炮'+'开始战斗');
}
lian.bubin=function(bubing_num){
    alert(bubing_num +'人'+'开始战斗');
}
lian.lianzhang = function(mingling){
    lian[mingling.type](mingling.num);
}

//总司令开始发令
lian.lianzhang({
    type:'paobing',
    mum:100
})
lian.lianzhang({
    type:'bubing',
    num:500
})
上一篇 下一篇

猜你喜欢

热点阅读