科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件校验值对象——应用Visitor模式和反射

校验值对象——应用Visitor模式和反射

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

值对象是一些单一的参数,用来联合一系列的对象——在大多数的情况下,在一个方法调用里有各种各样的参数。

作者:中国IT实验室 来源:中国IT实验室 2007年8月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
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!!!");
                 }
            }
      }
}
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章