JavaScript设计模式(三)

142 阅读1分钟

三、建造者模式

  • 概念:创建对象,注重创建对象的细节,运用于创建复杂对象或者复合对象
  • 实例:对有name,age,work的简历进行整理录入,对姓和名进行分别整理,对工种进行翻译输出,新增描述description,如果是工程师,描述为热爱编程,如果是老师为乐于分享,否则描述为无,修改工种,修改描述
  • 练习代码:
    let data = [
        {
            name:'zhang san',
            age:19,
            work:'engineer'
        },
        {
            name:'li si',
            age:30,
            work: 'teacher'
        },
        {
            name:'wang wu',
            age:27,
            work:'xxx'
        }
    ];
//创建对象归类姓名、年龄、姓、名,实例化work对象的work名称、work描述、work方法
    function Candidate(param){
        var _candidate = {};
        _candidate.name = param.name;
        _candidate.age = param.age;

        _candidate.firstName = param.name.split(' ')[0];
        _candidate.secondName = param.name.split(' ')[1];
        _candidate.work = {};
        switch (param.work) {
            case "engineer":
                _candidate.work.name = '工程师';
                _candidate.work.description = '打代码';
                break;
            case "teacher":
                _candidate.work.name = '教师';
                _candidate.work.description = '教书育人';
                break;
            default:
                _candidate.work.name = param.work;
                _candidate.work.description = '暂无描述';
        }

        _candidate.work.changeWork = function (work) {
            this.name = work;
        }
        return _candidate;
    }

//批量调用
    var candidateArr = [];
    for (var i=0;i<data.length;i++){
        candidateArr[i] = Candidate(data[i]);
    }
    
    console.log(Candidate(data[0]))
    console.log(candidateArr[0])
    Candidate(data[0]).work.changeWork('无业游民');
    candidateArr[0].work.changeWork('待业人员')
    let _candidate1 =Candidate(data[0]);
    _candidate1.work.changeWork('暂无');
    console.log(_candidate1)
  • 打印结果简单明了,自行总结

  • 也可将Candidate函数内部进行再封装

    function Candidate(param){
        let _candidate = new Person(param);
        _candidate.name = new CreateName(param.name);
        _candidate.work = new CreateWork(param.work);
        return _candidate;
    }
    function Person(param){
        this.name = param.name;
        this.age = param.age;
    }
    function CreateName(name){
        this.wholeName = name;
        this.firstName = name.split(' ')[0];
        this.secondName = name.split(' ')[1];
    }
    function CreateWork(work){
        switch (work) {
            case "engineer":
                this.name = '工程师';
                this.description = '打代码';
                break;
            case "teacher":
                this.name = '教师';
               this.description = '教书育人';
                break;
            default:
               this.name = work;
               this.description = '暂无描述';
        }
        this.changeWork = function (newWork) {
            this.name = newWork;
        }
    }
    var candidateArr = [];
    for (var i=0;i<data.length;i++){
        candidateArr[i] = Candidate(data[i]);
    }
    candidateArr[0].work.changeWork('新工作')
    console.log(candidateArr[0])