<!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>
java Script 组合模式 简单实例
最新推荐文章于 2024-08-18 23:21:29 发布