设计模式

设计模式

设计模式是代码经验的总结,设计模式都是面对对象的!

单例模式

1、js的单例最简单的方案就是字面量创建对象

           var gf = {
            'name': '刘亦菲'
          }

2、用闭包来实现单例

懒汉单例:先是null,调用的时候通过判断去决定是否new 好理解 好用 推荐

<script>
       function Girlfriend(name) {
           this.name = name
      }


       var getGf = (function () {
           var gf = null;
           return function (name) {
               if (!gf) {
                   gf = new Girlfriend(name)
              }
               return gf
          }
      })()


       var gf1 = getGf('张柏芝')
       console.log(gf1)
       var gf2 = getGf('苍老师')
       console.log(gf2)
       console.log(gf1 === gf2) // true
   </script>

3、饿汉单例:一上来直接new,内层函数里就不需要判断了

 <script>
       function Girlfriend(name) {
           this.name = name
      }

       // 饿汉单例:一上来直接new,内层函数里就不需要判断了
       var getGf = (function () {
           var gf = new Girlfriend("洛天依")
           return function (name) {
               return gf
          }
      })()

       var gf1 = getGf('张柏芝')
       console.log(gf1)  //Girlfriend {name: "洛天依"}
       var gf2 = getGf('苍老师')
       console.log(gf2) // Girlfriend {name: "洛天依"}
       console.log(gf1 === gf2) // true
   </script>

4、拓展!一样内容是true; 不一样的是false。

<script>
       function Person({ name, age }) {
           this.name = name;
           this.age = age;
      }
       var single = (function () {
           var ins = null;
           return {
               getInstance(params, Cons) {
                   if (!ins || ins.name != params.name) {

                       ins = new Cons(params)
                  }
                   return ins;
              }
          }
      }())


       var p1 = single.getInstance({ name: "小h", age: 18 }, Person);
       var p2 = single.getInstance({ name: "小明", age: 18 }, Person);
       console.log(p1);
       console.log(p1 === p2);  //false
       
   </script>

组合模式

 <script>
       // 将若干 命令 组合 调用
       var compose = {
           composes: [],
           add: function (func) {
               this.composes.push(func);
          },
           lost: function () {
               if (!this.composes.length) return;
               this.composes.forEach(el => {
                   typeof el === "function" && el()
              })

          }
      }
       function swiper() {
           console.log("轮播写完了");
      }
       function table() {
           console.log("选项卡写完了");
      }
       compose.add(swiper);
       compose.add(table);

       // compose.add(table);
       compose.lost();
   </script>

观察者模式

<body>
   <button>按钮</button>
   <script>
       /*
      观察者模式: 订阅模式   观察者:卖书店员 订阅者:你买书的人
        */
       /* var btn = document.querySelector("button");
      btn = document.addEventListener('click',function(){
          alert("触发了")
      }) */

       class Observer {
           msg = {}; //保存订阅的事件类型
           //绑定事件
           on(type, func) {
               if (this.msg[type]) return;
               this.msg[type] = func;
          }
           //调用事件
           emit(type) {
               // 判断有没有监听
               if (!this.msg[type]) return;
               this.msg[type]();
          }
           //移除事件
           off(type) {
               if (!this.msg[type]) return;
               this.msg[type] = null;
          }
      }

       var o = new Observer();
       o.on("abc", function () {
           console.log("嘿嘿嘿,我观察到你啦")
      })
       // o.emit("abc")
       // o.emit("abc")
       //先移除 后面就没有事件可以调用了 若是先调用 那肯定会调用一次
       o.off("abc");
       o.emit("abc")

   </script>
</body>

 

posted @ 2020-07-02 20:35  里拉米苏  阅读(191)  评论(0编辑  收藏  举报