我对责任链的一点心得

        责任链(Chain of Responsibility)模式:责任链模式是一种对象的行为模式【GOF95】。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织链和分配责任。
        消息过滤也是责任链的一个应用,把主体放在在链上传导,每个点过滤出其中一项。.举个例子吧,在大型项目中,大家会遇到这样一种情况,对某个对象进行多项验证,可能是十几项,也可能是几十项,每个验证项目会作用于多个其它需要验证的对象上。而且要考虑到扩展,随着业务的变化,验证的项目也要随着变化的,而且这种变化也要作用于对所有的需要进行这个验证的对象上。使用责任链模式就适合达到了这一要求。把这个验证项目连成一个链,链上的每个对象只针对一个验证项目,一个链针对于一个需要验证的对象,而不同的链上可能公用相同的验证项目,当更改这某个项目时,就同时对所有的对象更改了验证要求。下面我用代码演示一下。

public   abstract    class  DataFormatValidate
    
{
        
public DataFormatValidate()
        
{
        }


        
// Fields
        protected DataFormatValidate dataFormatValidater; 
        
// Methods
        public void SetNextValidater( DataFormatValidate dataFormatValidater )
        
{
            
this.dataFormatValidater = dataFormatValidater;
        }

        
abstract public string HandleRequest(DataRow dataRow);

    }


    
// TODO:验证字段的值是否合法
     public   class  ValueLargeZeroValidate:DataFormatValidate        
    
{

        
public override string HandleRequest(DataRow dataRow)
        
{
            
string errorInfo = string.Empty;
            
foreach(string mNumber in NumberCheckList)
            
{
                
try
                
{
                    
decimal dNumber = Convert.ToDecimal(dataRow[mNumber].ToString());
                    
if(dNumber < 0)
                    
{
                        errorInfo 
= mNumber + "字段应大于等于0。";
                        
break;
                    }
                
                }

                
catch
                
{
                    errorInfo 
= "字段" + mNumber + "的值应大于等于0。";
                    
break;
                }
                
            }

            
            
//
            if (errorInfo.Length > 0)
            
{
                
return errorInfo;
            }

            
else
            
{
                
return dataFormatValidater.HandleRequest(dataRow);
            }

        }

    }


    
// TODO:验证身份证证号的长度:
     public   class  IDCardLengthValidate:DataFormatValidate
    
{
        
public override string HandleRequest(DataRow dataRow)
        
{             
            
if(dataRow["Id_card"].ToString().Length != 18)
            
{
                
return "身份证号码:" + dataRow["Id_card"].ToString() + "的长度不足18位。";
            }

            
else
            
{
                
return this.dataFormatValidater.HandleRequest(dataRow);
            }

        }

    }


    
// TODO:结束验证的标识,返回空字符串
     public   class  EndStateValidate:DataFormatValidate
    
{
        
public override string HandleRequest(DataRow dataRow)
        
{
            
return string.Empty;
        }

    }

public   class  ValidateMain
    
{
        ValueLargeZeroValidate validate1 
= new ValueLargeZeroValidate();
        IDCardLengthValidate validate2 
= new IDCardLengthValidate();
        EndStateValidate validate3 
= new EndStateValidate();

        
public string DataValidate(DataRow dataRow)
        
{
            validate1.SetNextValidater(validate2);
            validate2.SetNextValidater(validate3);
                        
            
return validate1.HandleRequest(dataRow);
        }

    
    }

 一个验证主体来的时候,也就是一个DataRow,每个对象只验证其中一个DataComlun,当验证规则改变时,只要改变这个对象内的验证方法既可。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值