设计模式在js里中的应用

最近在看网易的公开课,有一节课有讲到设计模式在js中的应用,觉得把之前一直不太理解的这块内容讲得还挺直白的,现在就把课上的内容整理下来,当个笔记。
老师把二十多种设计模式分成了四个大类,分别是:创建型设计模式、结构型设计模式、行为型设计模式、技巧型设计模式。

创建型设计模式

创建型设计模式包括工厂模式、建造者模式、原型模式、单例模式。主要都是在创建一个对象时候需要考虑的。

工厂模式

工厂模式主要用于批量创建对象,当需要创建的对象的一些特性相对固定的时候,工厂模式是一种非常合适的模式。

  function ballFactor(type){
    if(typeof type!='string'){
       throw new Error('type must be a string');
    }
    //第一,不要遗漏防错处理
    //第二,定义一个方法或者一个类,你得这样写保证安全
    if(this instanceof ballFactor){
        var s = new this[type]();
        return s;
    }else{
        return new ballFactor(type);
    }
  }
  //定义球的类型
  ballFactor.prototype = {
    basketball : function(){
      this.name='basketball';
    },
    tennis : function(){
      this.name='tennis';
    }
  };
  //新创建一个球
  var a = new ballFactor('tennis');

建造者模式

建造者模式用于定制化的创建对象,当需要对一个对象的所有属性进行配置的时候,可以考虑建造者模式。

  //建造模式
    //需要关心如何组装对象
 function hand(size){
    console.log(size)
 }
 function foot(size){
    console.log(size);
 }
 function face(status){
    console.log(status);
 }
 function person(){
    this.hand = new hand(100);
    this.foot = new foot(180);
    this.face =new face('good');
 }

原型模式

原型模式用于创建一系列共享原型的对象,由于js天生自带原型属性,这里就不具体举例了。

单例模式

单例模式用于创建独一无二的对象,我们只能从这个对想象中的方法拿到里面的属性、方法,而无法通过new去实例化。

  //单例模式
    //保证全局只有一个对象
 var single = (function(){
  //定义私有变量
  function _a(){
     this.a = 123;
  };
  var ob = new _a();
  return {
    get:function(name){
        return ob[name];
     }
  }
 })();

结构型设计模式

在创建完对象之后,要对对象进行结构设计,结构包含了内部结构和外部结构,内部结构就是指对象内部的结构规划,外部结构更多的是处理对象与对象间的关系。结构型设计模式主要包括:外观模式、适配器模式、装饰器模式、代理模式、享元模式。

外观模式

外观模式就是把零散的接口组合到一起供外部调用的一种模式,类似于快餐店的套餐组合。

适配器模式

适配器模式就好比是转接头,将不适合的接口调整成适合的接口。

 //适配器模式
   //把不合适的东西进行适配

 //假设要把A框架的改为jquery框架,可以对A框架的实现进行重写
var A = {
  on:function(){
  
  }
}
 //重写on方法,实质上是去调用jquery的on方法
 A.on = function(dom,type,fn){
   return $(dom).on(dom,type,fn)
 }
 A.on();

装饰器模式

装饰器模式就是一种不修改源码地扩展方法地思路。

 //装饰器模式
   //不去修改源码的去扩张方法。
   var A = {
     c:function(){
        console.log(1)
      };
   }
  function deco(fn1, fn2){
    var _fn1 = fn1;
    var _fn2 = fn2;
    return function(){
        _fn1();
        _fn2();
    }
  }
  var a = deco(A.c, function(){
    console.log(2);
  });
  A.c = a;

享元模式

享元模式是一种优化程序性能的手段,通过共享公用数据来减少对象数量以达到优化程序的手段。享元模式适用于拥有大量类似对象并且对性能有要求的场景。dom中的事件委托就是享元模式的一种实际应用。

行为型设计模式

行为型设计模式主要是用来组织对象之间沟通的一种设计模式,主要包括:观察者模式、策略模式、状态模式、迭代器模式、解释器模式、命令模式。

观察者模式

观察者模式主要用于模块之间的沟通,例如jq中的自定义事件、vuex状态管理。

var obs={
    fallback:{},
    on : function(type,fn){
      this.fallback[type] = fn;
    },
    fire : function(type){
      this.fallback[type]();
    },
    delete : function(){
      this.fallback[type] = null;
    }
}
obs.on('mytest',function(){
  console.log(1);
})
obs.fire('mytest');

策略模式

 //策略模式
通过策略模式,将需要传相同类型的参数的几个函数封装成一个对象,单纯的通过调用实现具体的功能。
   function calc(type,a,b){
       var a={
          add : function(a,b){
            return a+b;
          },
          minus : function(a,b){
            return a-b
          }
       }
       a[type](a,b);
   }

状态模式

在策略模式的基础上加上一个状态管理。


      //状态模式
var a={
  statusArr:[],
  on : function(){
    this.statusArr.push(type);
  },
  fire : function(){
    this.statusArr.forEach((item,index) => {
      this.catorlist[item]();
    })
  },
  catorlist : {
    add : function(a,b){
      return a+b;
    },
    minus : function(a,b){
      return a-b;
    }           
  }
}
a.on('add');
a.on('minus');
a.fire();

命令模式

命令模式是一种指导思想,将具体的实现和需求解耦。

  //命令模式
var arr = [
                  document.getElementById("dom1"),
                  {title:'title',pic:"url1"},
                  {title:'title2',pic:"url2"},
                  {title:'title3',pic:"url4"}
];

function command () {
  var _html='';
  function create(arr){
    arr.forEach(function(item,index){
      _html+="<div><img src='"+item.pic+"'></img></div>";
    })
  }
  function display(content){
    content.innerHTML=_html;
  }
  function _excute(command){
    create(command.splice(1));
    display(command[0]);
  }
  return {
    excute:_excute;
  }
}
command().excute(arr);

迭代器模式

迭代器模式就是一系列的数据处理。

 //迭代器模式
  //把一系列数据的处理先写好
function calc(){

}
calc.prototype.equal = function(arr,num){
  var istrue = false;
  arr.forEach(function(item,index){
     if(item == num){
       istrue = true;
     }
  })
  return istrue;
}

解释器模式

解释器模式就相当于模版引擎的概念。

技巧性设计模式

技巧性设计模式包括:链模式、委托模式、节流模式、惰性模式、等待模式。许多技巧型模式都有对应的实例。

链模式

jq链式调用。

委托模式

js的事件委托。

节流模式

防抖截流。

惰性模式

目的是减少判断。

//惰性模式
  //b的值一开始制定,就不会变
  var b = 100;
  var a = (function(){
    if(b === 100){
       a = function(){console.log(1)};
    }else{
       a = function(){console.log(2)};
    }
  })();

等待者模式

等待者模式就类似于es2017中的async await的概念,等待上一个步骤执行完了,再执行下一个操作。

以上就是设计模式在js中的应用的相关整理,先放这里,以后有实际应用的时候翻看。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容