初学javascript设计模式三)组合模式第二遍遍阅读

9 篇文章 0 订阅
/*
组合模式
*/
/* 保存对象 */
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个文本框做测试);
组合模式对象与对象之间的耦合比较低,但是要注意,使用组合模式必须实现同样的接口,而接口的检查越严谨对象就越可靠,好吧我承认上面的例子我接口验证只要一个;
书上说,组合模式的优点是易用性,上面写的仅仅是一个例子体现组合模式的思想,而不是为了体现易用性;
*/
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值