設計模式——建造者模式

建造者模式

示例

描述

將一個複雜的對象構建層與其表示層相互分離, 一樣的構建過程當中可採用不一樣的表示. 建造者模式與工廠模式的不一樣之處在於, 它更多關心
建立對象的過程, 甚至於每個建立對象的細節.編程

案例

有一批求職者到招聘網站發佈本身的簡歷.要求:除了興趣愛好能夠發佈在頁面上, 我的聯繫方式不能發佈, 要讓需求公司找招聘平臺.
須要找的工做能夠分類.緩存

分析明確建立內容:網站

  1. 建立用戶信息如用戶名等須要獨立處理, 由於須要隱藏顯示this

  2. 應聘者須要獨立建立, 由於他們表明一個總體prototype

  3. 工做職位須要獨立建立, 由於他們是應聘者擁有的一部分, 並且種類較多code

實現

// 建立一位人類
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;
        if(name.indexOf(' ') > -1) {
            that.FirstName = name.slice(0, name.indexOf(' '));
            that.secondName = name.slice(name.indexOf(' '));
        }
    })(name, that);
};

// 實例化職位類
var Work = function() {
    var that = this;
    // 構造器中經過傳入的職位特徵來設置相應職位以及描述
    (function(work, that) {
        switch(work) {
            case 'code':
                that.work = '工程師';
                that.workDescript = '天天沉醉於編程';
                break;
            case 'UI':
                // ...
            case 'UE':
                // ...
            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;
};

// test:
var person = new Person('xiao ming', 'code');
console.log(person.skill);                        // 保密
console.log(person.name.FirstName);                // xiao
console.log(person.work);                        // 工程師
console.log(person.work.workDescript);            // 天天沉醉於編程

person.work.changeDescript('更改一下職位描述');
console.log(person.work.workDescript);             // 更改一下職位描述
相關文章
相關標籤/搜索