一、单例模式

  概念:在说单例模式的概念之前先了解下浏览器的回流和重绘

    浏览器渲染的流程:

      1、浏览器把获取到的HTML代码解析成DOM树,HTML中的每一个元素都是DOM树的一个节点,根节点就是document对象。

      2、当渲染树中的一部分因为元素的尺寸、布局、隐藏等改变而需要重新构建的时候,这时候就会发生回流。每个页面至少发生一次回流,也就是页面第一次加载的时候。在回流的时候,浏览器会使渲染树中收到影响的元素部分失效,并重新绘制这个部分的渲染树,完成回流以后,浏览器会重新绘制收到影响的部分元素到屏幕中,这个过程就是重绘。

      3、当渲染树中的一些元素需要一些更新属性的时候,而这些属性只会影响外观、风格,而不是影响布局的就称为重绘。  

      以上的概念中,说明回流必然会发生重绘,重绘不一定会引起回流。

      简单来说,回流会导致页面的重排,这样会严重影响性能。

  什么时候会发生回流:

    ①添加或删除可见DOM的时候

    ②元素的位置发生能改变

    ③元素尺寸改变

    ④内容改变

    ⑤页面第一次渲染的时候

  单利模式:保证系统中使用该模式的类只有一个实例。

  

  单例模式书写:

    假设我们要创建一个div然后查到页面中去,如果第一次我们没有这个div的时候我们需要创建一个,但是如果我们已经创建了一次后,第二次在调用这个方法的时候,还需要再创建一个吗?

        var createDiv=(function () {
            var div;
            return function () { 
                //单例模式最重要的一步,如果没有这个对象就创建该对象
                if(!div){
                    div=document.createElement("div");
                }
                return div;
            }
        })();
        var div1=createDiv();
        var div2=createDiv();
        console.log(div1===div2)//true

  

  利用单例模式创建一个弹出框:

        var layer=(function(){
            var div;
            function createDiv(){
                if(!div){
                    div=document.createElement("div");
                    document.body.appendChild(div);
                }
            }
            return {
                alert:function(text){
                    createDiv();
                    div.innerText=text;
                }
            }
        })();

        layer.alert("成功")

 

 二、代理模式

  概念:为其他对象提供一种代理以控制对这个对象的访问,简单来说,就是中介、经纪人模式。

  经纪人案例:

    需求:如果有人需要找宝宝拍电影,首先必须找到吉吉,经纪人可以先进行需求的判断再进行功能方法的调用。

        function Baobao(){
            this.doMovie=function(money){
                console.log("宝宝收到钱"+money+":安排档期拍电影")
            }
        }
        function Jiji(person){
            this.person=person
            //代理模式的逻辑判断交给代理来做
            this.talk=function(money){
                if(money>8000){
                    this.person.doMovie(money)
                }
            }
        }
        var proxys=new Jiji(new Baobao)
        proxys.talk(9000)

 

  利用代理模式实现预加载:

        function CreateImg(){
            var img=document.createElement("img");
            img.src="loading.gif";
            document.body.appendChild(img);
            this.setSrc=function(url){
                img.src=url;
            }
        }
        function ProxyImg(){
            var target=new CreateImg();
            var img=new Image();
            img.onload=function(){
                target.setSrc(this.src)
            }
            this.setSrc=function(url){
                img.src=url;
            }
        }
        var img=new ProxyImg();
        img.setSrc("w1.jpg");

  在图片的预加载中用到了代理模式,首先创建了一个ProxyImg方法,在这个方法中实例化了需要代理的这个对象CreateImg。通过new Image在浏览器中缓存图片,当这张图片加载完毕后对img标签重新赋值,如果没有加载成功,我们就显示loading这张照片。简单的说就是通过检测图片是否加载成功来做图片的替换,其中img.onload就相当于中介对象一样。

 

三、策略模式

  概念:所有的解决方案我们都因该提前设定好,不在根据当下的情形做判断,将不同的问题及不同的解决方案对应起来。

  作用:将问题和解决方案做了映射关系的处理,这样就不需要每次进行判断。

  案例:

        var Obj={
            person:{
                "a":function(){
                    console.log("盲僧")
                },
                "b":function(){
                    console.log("亚索")
                },
                "c":function(){
                    console.log("提莫")
                }
            },
            create:function(type){
          //通过type类型得到person对象,这样和switch一样,但是这样逻辑简化,代码效率提高了
return new this.person[type](); } } Obj.create("a");