改进你的数据校验 -- Value Object Validate 模式 (转)

本文介绍了一种用于简化J2EE应用程序中数据校验过程的设计模式——ValueObjectValidate模式。该模式利用反射机制自动匹配待校验对象和校验规则,从而避免了手动编写大量重复的校验代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

改进你的数据校验 -- Value Object Validate 模式 (转)[@more@]

Value object Validate  模式


  嗨!在J2EE开发中,你是否常常需要将数据对象持久化到数据库系统中,你是否为在持久化之前,校验大量的将被持久化的数据感到头疼,是否有一种比较好的方法来进行大量持久化数据的校验呢?本模式将提供一种比较可行的解决方法。

  Data Object Transfer 模式在j2ee应用中被广泛采用,它降低了数据在网络中传送的开销,改善了持久化的性能瓶颈,但是我们不得不面临一个问题,大量的数据对象在被持久化前需要严格的被校验,这必然造成大量的校验代码出现,如何消除手工书写大量的重复的校验代码呢?我采用了Value Object Validator校验模式。我的解决的方法1:采用反射,比较数据对象和校验对象的匹配项; 2:匹配相关项; 3:调用被校验对象的匹配get方法,获得值; 4:调用校验对象的匹配validate方法,校验3所获得得值。

  让我来用代码详细描述如下:
 首先让我来定义将被校验的类: 
  class Customer { 
    private String name;
  private Integer id;
 
  public void setName(String name){
    this.name =name;
  }
 
  public void setId(Integer id){
    this.id =id;
  }
 
  public String getName(){
  return name;
  }
 
  public Integer getId(){
  return id;
  }
 
 }

接下来来定义校验类

 class ValidateCustomer {
 
 
  public boolean validateName(String name) {
   //这里模拟校验
 if(name.equals("a")) return true;
  return false;
  }
 
  public boolean validateId(Integer id) { 

   //这里模拟校验
 if(id.equals(new Integer("1"))) return true;
  return false;
  } 
 
  }
 
 

我使用一个main来展示如何动态校验 
import Java.lang.reflect.*;
public class Test{
 
 public static void main(String[] args){
 
 try{
  ValidateCustomer  validateCustomer= new ValidateCustomer();
  Customer customer = new Customer(); 
 //设置数据对象的将被校验的数据 
  customer.setId(new Integer("1"));
  customer.setName("a");
 
  Method[] methodC = Class.forName("Customer").getMethods(); 
  Method[] methodV = Class.forName("ValidateCustomer").getMethods(); 
 
 
    String bname,vname;
    Object b ,a;
 
    for(int i=0;i    bname =methodC[i].getName();
    if(bname.startsWith("get")){
    bname =bname.substring(3,bname.length());   
     

  for(int j=0;j      vname =methodV[j].getName();
      if(vname.startsWith("validate")){
        vname = vname.substring(8,vname.length());    
 //注意这里,确保方法匹配

  if(bname.equalsIgnoreCase(vname)){   


  a = methodC[i].invoke(customer,new Object[]{});
        b= methodV[j].invoke(validateCustomer,new Object[]{a});
       
        if(b.toString().equals("false")){
         throw new Exception();
        }
       
 
    }
    }
    }
  }

  }
 
    System.out.println("ok");
    }catch(Exception e){
     System.out.println("can not access");
     }
 
}
}

 

正如你所看到的,我们消除了大量的匹配校验代码,实现了自动匹配,你可进一步改进本模式,实现一个通用校验类,使的进一步消除匹配代码。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752043/viewspace-993345/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752043/viewspace-993345/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值