JS之14种设计模式 (6)

图片描述

序列文章

JS面试之函数(1)
JS面试之对象(2)
JS面试之数组的几个不low操做(3)
JS面试之http0.9~3.0对比分析(4)
JS面试之数据结构与算法 (5)html

前言

设计模式若是应用到项目中,能够实现代码的复用和解耦,提升代码质量。 本文主要介绍14种设计模式
写UI组件,封装框架必备

1.简单工厂模式

1.定义:又叫静态工厂方法,就是建立对象,并赋予属性和方法
2.应用:抽取类相同的属性和方法封装到对象上
3.代码:面试

let UserFactory = function (role) {
  function User(opt) {
    this.name = opt.name;
    this.viewPage = opt.viewPage;
  }
  switch (role) {
    case 'superAdmin':
      return new User(superAdmin);
      break;
    case 'admin':
      return new User(admin);
      break;
    case 'user':
      return new User(user);
      break;
    default:
      throw new Error('参数错误, 可选参数:superAdmin、admin、user')
  }
}

//调用
let superAdmin = UserFactory('superAdmin');
let admin = UserFactory('admin') 
let normalUser = UserFactory('user')
//最后获得角色,能够调用

2.工厂方法模式

1.定义:对产品类的抽象使其建立业务主要负责用于建立多类产品的实例
2.应用:建立实例
3.代码:算法

var Factory=function(type,content){
  if(this instanceof Factory){
    var s=new this[type](content);
    return s;
  }else{
    return new Factory(type,content);
  }
}

//工厂原型中设置建立类型数据对象的属性
Factory.prototype={
  Java:function(content){
    console.log('Java值为',content);
  },
  PHP:function(content){
    console.log('PHP值为',content);
  },
  Python:function(content){
    console.log('Python值为',content);
  },
}

//测试用例
Factory('Python','我是Python');

3.原型模式

1.定义:设置函数的原型属性
2.应用:实现继承
3.代码:segmentfault

function Animal (name) {
  // 属性
  this.name = name || 'Animal';
  // 实例方法
  this.sleep = function(){
    console.log(this.name + '正在睡觉!');
  }
}
// 原型方法
Animal.prototype.eat = function(food) {
  console.log(this.name + '正在吃:' + food);
};

function Cat(){ 
}
Cat.prototype = new Animal();
Cat.prototype.name = 'cat';

// Test Code
var cat = new Cat();
console.log(cat.name);//cat
console.log(cat.eat('fish'));//cat正在吃:fish  undefined
console.log(cat.sleep());//cat正在睡觉! undefined
console.log(cat instanceof Animal); //true 
console.log(cat instanceof Cat); //true

4.单例模式

1.定义:只容许被实例化依次的类
2.应用:提供一个命名空间
3.代码:设计模式

let singleCase = function(name){
    this.name = name;
};
singleCase.prototype.getName = function(){
    return this.name;
}
// 获取实例对象
let getInstance = (function() {
    var instance = null;
    return function(name) {
        if(!instance) {//至关于一个一次性阀门,只能实例化一次
            instance = new singleCase(name);
        }
        return instance;
    }
})();
// 测试单体模式的实例,因此one===two
let one = getInstance("one");
let two = getInstance("two");

5.外观模式

1.定义:为子系统中的一组接口提供一个一致的界面
2.应用:简化复杂接口
3.代码:
外观模式数组

6.适配器模式

1.定义:将一个接口转换成客户端须要的接口而不须要去修改客户端代码,使得不兼容的代码能够一块儿工做
2.应用:适配函数参数
3.代码:
适配器模式缓存

7.装饰者模式

1.定义:不改变原对象的基础上,给对象添加属性或方法
2.代码数据结构

let decorator=function(input,fn){
  //获取事件源
  let input=document.getElementById(input);
  //若事件源已经绑定事件
  if(typeof input.onclick=='function'){
    //缓存事件源原有的回调函数
    let oldClickFn=input.onclick;
    //为事件源定义新事件
    input.onclick=function(){
      //事件源原有回调函数
      oldClickFn();
      //执行事件源新增回调函数
      fn();
    }
  }else{
    //未绑定绑定
    input.onclick=fn;
  }
}

//测试用例
decorator('textInp',function(){
  console.log('文本框执行啦');
})
decorator('btn',function(){
  console.log('按钮执行啦');
})

8.桥接模式

1.定义:将抽象部分与它的实现部分分离,使它们均可以独立地变化
2.代码
桥接模式框架

9.模块方法模式

1.定义:定义一个模板,供之后传不一样参数调用
2.代码:
模块方法模式函数

10.观察者模式

1.做用:解决类与对象,对象与对象之间的耦合
2.代码:

let Observer=
  (function(){
    let _message={};
    return {
      //注册接口,
        //1.做用:将订阅者注册的消息推入到消息队列
        //2.参数:因此要传两个参数,消息类型和处理动做,
        //3.消息不存在从新建立,存在将消息推入到执行方法
        
      regist:function(type,fn){
        //若是消息不存在,建立
        if(typeof _message[type]==='undefined'){
          _message[type]=[fn];
        }else{
          //将消息推入到消息的执行动做
          _message[type].push(fn);
        }
      },

      //发布信息接口
        //1.做用:观察这发布消息将全部订阅的消息一次执行
        //2.参数:消息类型和动做执行传递参数
        //3.消息类型参数必须校验
      fire:function(type,args){
        //若是消息没有注册,则返回
        if(!_message[type]) return;
          //定义消息信息
          var events={
            type:type, //消息类型
            args:args||{} //消息携带数据
          },
          i=0,
          len=_message[type].length;
          //遍历消息
          for(;i<len;i++){
            //依次执行注册消息
            _message[type][i].call(this,events);
          }
      },

      //移除信息接口
        //1.做用:将订阅者注销消息从消息队列清除
        //2.参数:消息类型和执行的动做
        //3.消息参数校验
      remove:function(type,fn){
        //若是消息动做队列存在
        if(_message[type] instanceof Array){
          //从最后一个消息动做序遍历
          var i=_message[type].length-1;
          for(;i>=0;i--){
            //若是存在该动做在消息队列中移除
            _message[type][i]===fn&&_message[type].splice(i,1);
          }
        }
      }
    }
  })()

//测试用例
  //1.订阅消息
  Observer.regist('test',function(e){
    console.log(e.type,e.args.msg);
  })

  //2.发布消息
  Observer.fire('test',{msg:'传递参数1'});
  Observer.fire('test',{msg:'传递参数2'});
  Observer.fire('test',{msg:'传递参数3'});

11.状态模式

1.定义:一个对象状态改变会致使行为变化
2.做用:解决复杂的if判断
3.代码
状态模式

12.策略模式

1.定义:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间能够相互替换,独立于使用算法的客户
2.代码
策略模式

13.访问模式

1.定义:经过继承封装一些该数据类型不具有的属性,
2.做用:让对象具有数组的操做方法
3.代码:
访问者模式

14.中介者模式

1.定义:设置一个中间层,处理对象之间的交互
2.代码:
中介者模式

相关文章
相关标签/搜索