/*
组合模式
*/
/* 保存对象 */
var SaveObj = {};
/* 统一验证对象 */
var Check = {
IsNull: function() {
var valArr = this.GetVal();
var retArr = [];
var i = valArr.length;
while (i--) {
if (valArr[i][0].length <= 0) {
this.Errmsg.push(valArr[i][1]);
}
else {
retArr.push(valArr[i][0]);
}
}
return retArr;
},
IsNaN: function() {
var valArr = this.GetVal();
var retArr = [];
var i = valArr.length;
while (i--) {
if (isNaN(valArr[i][0])) {
this.Errmsg.push(valArr[i][1]);
}
else {
retArr.push(valArr[i][0]);
}
}
return retArr;
}
}
/* 叶对象超类
这个超类是为了确保所有的叶对象
*/
var BackLeaf = function() { }
BackLeaf.prototype.Test = function() {
throw Error("叶对象基类无法直接调用")
};
BackLeaf.prototype.GetVal = function() {
throw Error("叶对象基类无法直接调用")
};
/* 文本框叶对象 */
var TextLeaf = function(obj) {
this.Errmsg = [];
this._obj = [];
var _obj = $(obj);
var i = _obj.length;
while (i--) {
this._obj.push(_obj.eq(i));
}
return this;
};
/* 继承叶对象超类 */
TextLeaf.prototype = new BackLeaf();
TextLeaf.prototype.Test = function(checkType) {
this.checkType = checkType;
var i = this._obj.length;
while (i--) {
return Check[this.checkType].call(this);
}
}
TextLeaf.prototype.GetVal = function() {
var i = this._obj.length;
var ret = [];
while (i--) {
ret.push([this._obj[i].val(), this._obj[i].attr("errmsg")]);
}
return ret;
}
TextLeaf.prototype.GetErrmsg = function() {
return this.Errmsg.join('\n');
}
/* 组合对象 */
var Combination = function() {
this.Count = [];
this.i = 0;
}
Combination.prototype.Add = function(obj) {
if (obj instanceof Array) {
for (var i in obj) {
this.Count.push(obj[i]);
}
}
else {
this.Count.push(obj);
}
this.i = this.Count.length
}
Combination.prototype.Test = function(checkType) {
var ret = [];
for (var i = 0; i < this.i; i++) {
var _t = this.Count[i].Test(checkType);
if (_t !== false && this.Count[i].GetErrmsg().length <= 0) {
ret.push(_t);
}
}
return this.length() === ret.length;
}
Combination.prototype.length = function() {
return this.Count.length;
}
Combination.prototype.GetErrmsg = function() {
var errmsg = [];
for (var i = 0; i < this.i; i++) {
errmsg.push(this.Count[i].GetErrmsg());
}
return errmsg.join('\n');
}
var c = new Combination();
c.Add(new TextLeaf("input"));
c.Add(new TextLeaf("#cc"));
var a = new Combination();
a.Add(c);
a.Add(new TextLeaf("#bb"));
if (!a.Test("IsNull")) {
alert(a.GetErrmsg());
}
/*****************************************************************/
/*
PS:组合模式会使简单的操作产生复制的结果,
因为每个组合对象的一个操作将会被传递到组合对象所包含的所有叶对象(组合对象包含组合对象的情况也会继续往下传递至底层的叶对象),
这会使结构复杂的组合对象或者说庞大的组合对象在进行操作传递的时候,影响性能(上面的验证我只用了2K个文本框做测试);
组合模式对象与对象之间的耦合比较低,但是要注意,使用组合模式必须实现同样的接口,而接口的检查越严谨对象就越可靠,好吧我承认上面的例子我接口验证只要一个;
书上说,组合模式的优点是易用性,上面写的仅仅是一个例子体现组合模式的思想,而不是为了体现易用性;
*/