java Script 组合模式 简单实例

来源:互联网 发布:2000到2008年网络歌曲 编辑:程序博客网 时间:2024/05/18 01:46
<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>    </head>    <body>    </body>    <script defer="defer" charset="UTF-8" type="text/javascript">        (function() {            Array.prototype.each = function(fn) {                try {                    this.i || (this.i = 0);                    if(this.length > 0 && fn.constructor == Function) {                        while(this.i < this.length) {                            var e = this[this.i];                            if(e && e.constructor == Array) {                                e.each(fn);                            } else {                                fn.apply(e, [e]);                            }                            this.i++                        }                        this.i = null;                    }                } catch(ex) {                }                return this            }            var Interface = function(name, methods) {                //1.判断实参的个数                if(arguments.length != 2) {                    throw new Error("参数不够");                }                this.name = name;                this.methods = [];                for(var i = 0, len = methods.length; i < len; i++) {                    if(typeof methods[i] !== "string") {                        throw new Error("方法名必须是String类型");                    }                    this.methods.push(methods[i]);                }            }            Interface.ensureImplements = function(object) {                if(arguments.length < 2) {                    throw new Error("参数个数不够")                }                for(var i = 1, len = arguments.length; i < len; i++) {                    var interfaceName = arguments[i];                    if(interfaceName.constructor !== Interface) {                        throw new Error("接口类型不匹配");                    }                    for(var j = 0; j < interfaceName.methods.length; j++) {                        var methodName = interfaceName.methods[j];                        if(!object[methodName] || typeof object[methodName] !== "function") {                            throw new Error("方法不存在");                        }                    }                }            }            window.Interface = Interface;        })();        (function() {            var Org = function(name) {                this.name = name;                this.depts = [];            }            Org.prototype = {                constructor: Org,                addDepts: function(childDept) {                    this.depts.push(childDept);                    return this;                },                getDepts: function() {                    return this.depts;                }            }            var Dept = function(name) {                this.name = name;                this.persons = [];            }            Dept.prototype = {                constructor: Org,                addPersons: function(childPersons) {                    this.persons.push(childPersons);                    return this;                },                getPersons: function() {                    return this.persons;                }            }            var Person = function(name) {                this.name = name;            }            Person.prototype = {                constructor: Person,                work: function() {                    console.info("努力工作的" + this.name);                },                sleep: function() {                    console.info("睡觉中的" + this.name);                }            }            var a = new Person("a");            var b = new Person("b");            var c = new Person("c");            var d = new Person("d");            var e = new Person("e");            var f = new Person("f");            var A = new Dept("A");            A.addPersons(a).addPersons(b).addPersons(c);            var B = new Dept("B");            B.addPersons(d).addPersons(e).addPersons(f);            var Aa = new Org("Org");            Aa.addDepts(A).addDepts(B);            //最终的节点落实在人上面    如果是部门呢?如果部门下面 又创建了部门呢? OMG  不敢想了,此时  组合模式就诞生了。            for(var i = 0, depts = Aa.getDepts(); i < depts.length; i++) {                for(var j = 0, persons = depts[i].getPersons(); j < persons.length; j++) {                    if(persons[j]["name"] === "e") {                        //persons[j].work();                    }                }            }        })();        (function() {            /*             * 应用场景(节点随便添加完全无视)             总公司--->上海分公司--->财务部门--->财务A             *                           --->财务B             *                --->销售部门--->销售A             *                           --->销售B             *                --->财务部门--->财务A              *                           --->财务B                              --->销售部门 --->销售A            */            var CompositeInterface = new Interface("CompositeInterface", ["addChild", "getChild"]);            var LeafInterface = new Interface("LeafInterface", ["work", "sleep"]);            //组合对象            var Composite = function(name) {                this.name = name;                this.type = "Composite";                this.children = [];            };            Composite.prototype = {                    constructor: Composite,                    addChild: function(child) {                        this.children.push(child);                        return this;                    },                    getChild: function(name) {                        var elements = [];                        var pushLeaf = function(item) {                            if(item.type === "Composite") {                                item.children.each(arguments.callee);                            } else if(item.type === "Leaf") {                                elements.push(item);                            }                        }                        if(name && this.name !== name) {                            this.children.each(function(item) {                                if(item.name === name && item.type === "Composite") {                                    item.children.each(pushLeaf);                                }                                if(item !== name && item.type === "Composite") {                                    item.children.each(arguments.callee);                                }                                if(item.name === name && item.type === "Leaf") {                                    elements.push(item);                                }                            });                        } else {                            this.children.each(pushLeaf);                        }                        return elements;                    },                    work: function(name) {                        var childObjects = this.getChild(name);                        for(var i = 0; i < childObjects.length; i++) {                            childObjects[i].work();                        }                    },                    sleep: function(name) {                        var childObjects = this.getChild(name);                        for(var i = 0; i < childObjects.length; i++) {                            childObjects[i].sleep();                        }                    }                }                //叶子对象            var Leaf = function(name) {                this.name = name;                this.type = "Leaf";            };            Leaf.prototype = {                constructor: Leaf,                addChild: function(child) {                    throw new SyntaxError("最底层节点 无法在添加子节点");                },                getChild: function(name) {                    if(this.name === name) {                        return this;                    }                    return null;                },                work: function() {                    console.info("努力工作的" + this.name);                },                sleep: function() {                    console.info("睡觉中的" + this.name);                }            }            var a = new Leaf("a");            var b = new Leaf("b");            var c = new Leaf("c");            var d = new Leaf("d");            var e = new Leaf("e");            var f = new Leaf("f");            var A = new Composite("A");            A.addChild(a).addChild(b).addChild(c);            var B = new Composite("B");            B.addChild(d).addChild(e).addChild(f);            var Aa = new Composite("Org");            Aa.addChild(A).addChild(B);            /*调用规则*/            Aa.work();            Aa.work("A");            Aa.work("b");        })();    </script></html>
0 0