Validateable接口
Validateable接口有着和Visitable接口相同的功能。那个定义的方法validateWith()是一个和Visitor模式里的Visitable接口的accept()方法相似的方法。通过validateWith()方法,你就能够校验有着不同validators的值对象,因为这个方法以IClassAttributeValidator接口的实现作为参数。
IClassAttributeValidator接口
IClassAttributeValidator接口和Visitor模式的Visitor接口相对应。其中的validate(AbstractParameter param)方法和Visitor接口的visit(object SomeObject)方法相似。validate()方法的AbstractParameter参数类型允许我们通过任何AbstractParameter类的子类类型的参数访问validate。另外,在validateWith()方法里使用这个接口作为参数允许我们在将来改变使用的validator,用这些改变的validator作为来满足不同的validation的需求——例如,除了null检测以外,在一个定义的值范围测试参数属性。
AbstractParameter
AbstractParameter类实现了Validateable接口的validateWith()方法。就像你将要看到的下面的代码片断一样,这个实现非常简单。这个方法仅仅是调用给定的validator的validate()方法,并且传递参数对象到validator:
public void validateWith( IClassAttributeValidator validator ) throws Exception
{
validator.validate( this );
}
而且,AbstractParameter也实现一些常用的其他方法。受保护的方法:addOptionalMethod()使得所有的子类型增加一些可选择的方法到optionalGetAttributeMethods HashMap()。继承自AbstractParameter使得你能够取得哪些可能传递null的getters方法。就像你能想象到的一样,你能够增加可选择的方法,例如,到继承自AbstractParameter的值对象的构造器里。
isOptionalMethod()方法用于检测属性是否已经被校验过了。
toString()方法实现了一些便利,因为值对象可能是由很多属性组成。使得在AbstractParameter的子类里,不需要写很多的System.out.printlns实现。这个方法也是使用反射达到目的的。
GenericClassAttributeValidator
GenericClassAttributeValidator类实现了IClassAttributeValidator接口的validate()方法。这个类同时也实现了单态模式。validate()的实现看起来象下面这样:
public synchronized void validate( AbstractParameter param ) throws AttributeValidatorException
{
Class clazz = param.getClass();
Method[] methods = clazz.getMethods();
//Cycle over all methods and call the getters!
//Check if the getter result is null.
//If result is null throw AttributeValidatorException.
Iterator methodIter = Arrays.asList( methods ).iterator();
Method method = null;
String methodName = null;
while ( methodIter.hasNext() )
{
method = (Method) methodIter.next();
methodName = method.getName();
if ( methodName.startsWith( "get" ) &&
clazz.equals( method.getDeclaringClass() ) &&
!param.isOptionalMethod( methodName ) )
{
Object methodResult = null;
try
{
methodResult = method.invoke( param, null );
}
catch ( IllegalArgumentException e )
{
throw new AttributeValidatorException( e.getMessage() );
}
catch ( IllegalAccessException e )
{
throw new AttributeValidatorException( e.getMessage() );
}
catch ( InvocationTargetException e )
{
throw new AttributeValidatorException( e.getMessage() );
}
if ( methodResult == null )
{
String attributeName = methodName.substring( 3, 4 ).toLowerCase() +
methodName.substring( 4, methodName.length() );
String className = clazz.getName();
className = className.substring( className.lastIndexOf( '.' ) + 1 );
Integer errorNumber = new Integer( 1000 );
throw new AttributeValidatorException( "Error: " + errorNumber + " "
+ attributeName + " in " + className +" is null!!!");
}
}
}
}