javascript组合模式

javascript 组合模式


需求:一个学校有两个班级,每个班级有两个组,小组分着上课,一起考试

不使用组合模式:

      /*
        * 需求 ,
        * 一个学校有两个班级,每个班级有两个组,小组分着上课,一起考试
        *
        *不使用组合模式
        * */
        var school = function (name) {
            this.name = name;
            var classList = [];
            this.add=function (cls) {
                classList.push(cls);
                return this;
            };
            this.getList = function () {
                return classList;
            }
        }


        var classList = function (name) {
            this.name = name;
            var groupList = [];
            this.add=function (group) {
                groupList.push(group);
                return this;
            };
            this.getList = function () {
                return groupList;
            }
        }

        var groupList = function (name) {
            this.name = name;
            var studentList = [];
            this.add=function (s) {
                studentList.push(s);
                return this;
            };
            this.getList = function () {
                return studentList;
            }
        }


        var student = function (name) {
            this.name = name;
            this.goClass = function () {
                console.log(this.name+"上课");
            };
            this.gokoshi = function () {
                console.log(this.name+"考试");
            }
        };
        var zs = new student('zs');
        var ls = new student('ls');
        var ww = new student('ww');
        var zl = new student('zl');
        var mz = new student('mz');
        var we = new student('we');
        var gd = new student('gd');
        var jg = new student('jg');
        var one = new classList("一班");
        var oneOne = new groupList("一班一组");
        oneOne.add(zs).add(ls);
        var oneTwo = new groupList("二班二组");
        oneTwo.add(ww).add(zl);
        one.add(oneOne).add(oneTwo);
        var two = new classList("二班");
        var twoOne = new groupList("二班一组");
        twoOne.add(mz).add(we);
        var twoTwo = new groupList("二班二组");
        twoTwo.add(gd).add(jg);
        two.add(twoOne).add(twoTwo);
        var scl = new school("苏屯");
        scl.add(one).add(two);

        console.log(scl.getList());
        /*
        * 一班一组上课
        * */

        var list = scl.getList();
        list.forEach(function (i) {
            if(i.name=="一班"){
                i.getList().forEach(function (j) {
                    if(j.name=="一班一组"){
                        console.log(j.getList());
                        j.getList().forEach(function (k) {
                            k.goClass();
                        })
                    }
                })
            }
        })


组合模式:

  /*
        * 组合模式的实现
        *
        * */

        var Interface = function (name,methods) {
            if(arguments.length!=2){
                throw new Error('必须输入两个参数,当前个数'+arguments.length);
            };
            this.name = name; //接口名
            this.methods = []; //函数名
            for(var i=0;i<methods.length;i++){
                if(typeof methods[i] !== 'string'){
                    throw new Error('方法名参数必须为string');
                }else{
                    this.methods.push(methods[i]);
                }

            }
        };
        //定义静态方法,检验实现接口和实现类 参数object为实现类对象

        Interface.ensureImplements = function (object) {
            if(arguments.length<2){
                throw new Error('必须输入两个参数,当前个数' + arguments.length);
                return;
            };
            for(var i =1;i<arguments.length;i++){
                var interface = arguments[i];
                if(interface.constructor != Interface){
                    throw new Error("接口没有实现");
                };
                for(var j=0;j<interface.methods.length;j++){
                    var method = interface.methods[j];
                    if(!object[method] || typeof object[method]!=='function'){
                        throw new Error("接口名:"+interface.name+"方法名:"+method+"没找到");
                    }
                }
            }

        };
        function extend(subClass,superClass) {
            var f = function () {};
            f.prototype =superClass.prototype;
            subClass.prototype = new f();
            subClass.prototype.constructor = subClass;
            subClass.superclass =superClass.prototype;
            if(superClass.prototype.constructor==Object.prototype.constructor){
                superClass.prototype.constructor =superClass;
            }
        };

        var compo = new Interface('compo',['add','getList']);
        var leaf = new Interface('leaf',['goClass','gokoshi']);
        function compoList(name) {
            this.name =name;
            this.type = 1;
            var childList =[];
            this.add=function (child) {
                childList.push(child);
                return this;
            };
            this.getList=function(name){

                var toChild = [];

                if(!name){

                    childList.forEach(function (item) {
                        if(item.type==1){
                            toChild = toChild.concat(item.getList());

                        }else{
                            toChild.push(item);
                        }
                    })
                }else{
                    childList.forEach(function (unit) {
                        if(unit.name ==name){
                            if(unit.type==1){
                                toChild = toChild.concat(unit.getList());
                                return;
                            }else{
                                toChild.push(unit);
                                return;
                            }
                        }else{
                            if(unit.type==1){
                                toChild=toChild.concat(unit.getList(name))
                            }

                        }
                    })
                }
                return toChild;
            };
            this.goClass=function (name) {

                var toChild = this.getList(name);
                toChild.forEach(function (item) {
                    item.goClass();
                })
            };
            this.gokoshi=function (name) {
                var toChild = this.getList(name);
                toChild.forEach(function (item) {
                    item.gokoshi();
                })
            };
            Interface.ensureImplements(this,compo,leaf);
        }
        function leafList(name) {
            this.name =name;
            this.type = 0;
            this.add=function (child) {
                throw new Error("该方法不能实现");
            };
            this.getList=function(name){
                if(this.name==name){
                    return this;
                }else {
                    return "";
                }

            };
            this.goClass=function () {
               console.log(this.name+"上课");
            };
            this.gokoshi=function () {
                console.log(this.name+"考试");
            };
            Interface.ensureImplements(this,compo,leaf);
        }


        var zs = new leafList('zs');
        var ls = new leafList('ls');
        var ww = new leafList('ww');
        var zl = new leafList('zl');
        var mz = new leafList('mz');
        var we = new leafList('we');
        var gd = new leafList('gd');
        var jg = new leafList('jg');
        var one = new compoList("一班");
        var oneOne = new compoList("一班一组");
        oneOne.add(zs).add(ls);

        var oneTwo = new compoList("二班二组");
        oneTwo.add(ww).add(zl);
        one.add(oneOne).add(oneTwo);
        var two = new compoList("二班");
        var twoOne = new compoList("二班一组");
        twoOne.add(mz).add(we);
        var twoTwo = new compoList("二班二组");
        twoTwo.add(gd).add(jg);
        two.add(twoOne).add(twoTwo);
        var scl = new compoList("苏屯");

        scl.add(one).add(two);



        scl.goClass("二班");
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值