zoukankan      html  css  js  c++  java
  • 设计模式spring源码中使用策略模式(Strategy Pattern)

    转载http://liuxi1024.iteye.com/blog/583145  

        策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下:

    定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

    策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

    下面使用spring中源码说明策略模式(spring validation)

    1、UML图说明



     说明:UserValidator、HarmlessHandleValidator 分别为两个行为策略,实现不同的算法。

    2、类和接口代码

    Class: org.springframework.validation.ValidationUtils 验证工具类

    Java代码  收藏代码
    1. public static void invokeValidator(Validator validator, Object obj, Errors errors) {  
    2.         Assert.notNull(validator, "Validator must not be null");  
    3.         Assert.notNull(errors, "Errors object must not be null");  
    4.         if (logger.isDebugEnabled()) {  
    5.             logger.debug("Invoking validator [" + validator + "]");  
    6.         }  
    7.         if (obj != null && !validator.supports(obj.getClass())) {  
    8.             throw new IllegalArgumentException(  
    9.                     "Validator [" + validator.getClass() + "] does not support [" + obj.getClass() + "]");  
    10.         }  
    11.         validator.validate(obj, errors);  
    12.         if (logger.isDebugEnabled()) {  
    13.             if (errors.hasErrors()) {  
    14.                 logger.debug("Validator found " + errors.getErrorCount() + " errors");  
    15.             }  
    16.             else {  
    17.                 logger.debug("Validator found no errors");  
    18.             }  
    19.         }  
    20.     }  
     

     Interface:org.springframework.validation.Validator

    Java代码  收藏代码
    1. public interface Validator {  
    2.     boolean supports(Class clazz);  
    3.     void validate(Object target, Errors errors);  
    4.   
    5. }  

     Class:UserValidator

    Java代码  收藏代码
    1. public class UserValidator implements Validator {  
    2.   
    3.     @Override  
    4.     public boolean supports(Class clazz) {  
    5.         return User.class.equals(clazz);  
    6.     }  
    7.   
    8.     @Override  
    9.     public void validate(Object target, Errors errors) {  
    10.         User user = (User) target;  
    11.         if (!StringUtils.hasLength(user.getUsername())) {  
    12.             errors.rejectValue("username", "", "登录编码必须填写!");  
    13.         }  
    14.         if (!StringUtils.hasLength(user.getPassword())) {  
    15.             errors.rejectValue("password", "", "登录密码必须填写!");  
    16.         }  
    17.         if (!StringUtils.hasLength(user.getName())) {  
    18.             errors.rejectValue("name", "", "用户姓名必须填写!");  
    19.         }  
    20.     }  
    21.   
    22. }  

    Class:HarmlessHandleValidator

    Java代码  收藏代码
    1. public class HarmlessHandleValidator implements Validator {  
    2.   
    3.     @Override  
    4.     public boolean supports(Class clazz) {  
    5.         return HarmlessHandle.class.equals(clazz);  
    6.     }  
    7.   
    8.     @Override  
    9.     public void validate(Object target, Errors errors) {  
    10.         HarmlessHandle harmlessHandle = (HarmlessHandle) target;  
    11.         if (!StringUtils.hasLength(harmlessHandle.getHandleNo())) {  
    12.             errors.rejectValue("handleNo", "", "编码必须填写!");  
    13.         }  
    14.         if (!StringUtils.hasLength(harmlessHandle.getHandleName())) {  
    15.             errors.rejectValue("handleName", "", "名称必须填写!");  
    16.         }  
    17.     }  
    18.   
    19. }  
     

    调用各自的validate策略

    Java代码  收藏代码
    1. ValidationUtils.invokeValidator(new UserValidator(), user, errors);  

     

    3、策略模式的本质:少用继承,多用组合

     

    over^^

  • 相关阅读:
    jsp Ajax请求(返回xml数据类型)
    springboot整合mybatis
    springboot使用jdbcTemplate案例
    springboot使用jpa案例
    使用SpringBoot访问jsp页面
    SpringBoot使用thymeleaf案例
    SpringBoot
    Dobbox
    Spring Jpa
    SSM整合Dubbo登陆案例
  • 原文地址:https://www.cnblogs.com/chenying99/p/2698653.html
Copyright © 2011-2022 走看看