JavaScript设计模式

学习JavaScript设计模式——建造者模式

2019-03-13  本文已影响0人  小霸王的铲屎官

建造者模式——分即是合

建造者模式: 将一个复杂对象的构建层与其表示层相互分离,同样的构造过程可采用不同的表示。

对比

首先,需要的人类的类,和人类的姓名类、职位类等(在类里使用闭包,可以让这个闭包既是闭包,又是这个类的构造函数)

  // 创建一位人类
  var Human = function(param){
     // 技能
     this.skill = param && param.skill || '保密';
     // 兴趣爱好
     this.hobby = param && param.hobby || '保密'
  }
  
  // 人类类的原型
  Human.prototype = {
    getSkill: function(){
       return this.skill
    },
    getHobby: function(){
       return this.hobby
    }
  }
  
  // 实例化姓名类
  var Named = function(name){
      var that = this;
      // 构造器
      // 构造函数解析姓名的姓与名
      (function(name, that){
         that.wholeName = name  // 缓存这个name
         if(name.indexOf(' ')> -1){
           that.firstName = that.wholeName.slice(0, that.wholeName.indexOf(' '));
           that.secondName = that.wholeName.slice(that.wholeName.indexOf(' '))
         }
      })(name, that)
  }
  
  // 实例化职位类
  var Work = function(work){
    var that = this
    // 构造器
    // 构造函数中通过传入的职位特征来设置相应职位以及描述
    (function(work,that){
      switch(work){
        case 'code':
          that.work = '工程师';
          that.workDescript = '每天沉醉于编程';
          break;
        case 'UI':
        case 'UE':
          that.work = '设计师';
          that.workDescript = '设计更似一种艺术';
          break;
        case 'teach':
          that.work = '教师';
          that.workDescript = '分享也是一种快乐';
          break;
        default:
          that.work = work;
          that.workDescript = '对不起,我们还不清楚您所选择职位的相关描述';  
      } 
    })(work, that)
  }
  
  // 更换期望的职位
  Work.prototype.changeWork = function(work){
    this.work = work
  }
  
  // 添加更换职位的描述
  Work.prototype.changeDescript = function(setence){
    this.workDescript = setence
  }
  
 /****
  * 应聘者建造者
  * 参数 name: 姓名(全名) 空格分隔姓名
  * 参数 work: 期望职位
  **/
  var Person = function(name, work){
    // 创建应聘者缓存对象
    var _person = new Human();
    // 创建应聘者姓名解析对象
    _person.name = new Named(name);
    // 创建应聘者期望职位
    _person.work = new Work(work);
    // 将创建的应聘者对象返回
    return _person;
  }

测试代码

 var person = new Person('Sun Wukong', 'code');
 
 console.log(person.skill)              // 保密
 console.log(person.name.firstName)     // Sun
 console.log(person.work.work)          // 工程师
 console.log(person.work.workDescript)  // 每一天在编程中度过
 person.work.changeDescript('更改一下职位描述!')
 console.log(person.work.workDescript)  // 更改一下职位描述!
 

总结

注意

这篇文字有点多,需要尽力去理解,还要对照前面的工厂模式来看

上一篇 下一篇

猜你喜欢

热点阅读