责任链(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);
}
}
... {
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,当验证规则改变时,只要改变这个对象内的验证方法既可。