您的位置:首页 > 编程语言 > Java开发

设计模式--spring源码中使用策略模式(Strategy Pattern)

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

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

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

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

1、UML图说明



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

2、类和接口代码

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

Java代码  


public static void invokeValidator(Validator validator, Object obj, Errors errors) {  

        Assert.notNull(validator, "Validator must not be null");  

        Assert.notNull(errors, "Errors object must not be null");  

        if (logger.isDebugEnabled()) {  

            logger.debug("Invoking validator [" + validator + "]");  

        }  

        if (obj != null && !validator.supports(obj.getClass())) {  

            throw new IllegalArgumentException(  

                    "Validator [" + validator.getClass() + "] does not support [" + obj.getClass() + "]");  

        }  

        validator.validate(obj, errors);  

        if (logger.isDebugEnabled()) {  

            if (errors.hasErrors()) {  

                logger.debug("Validator found " + errors.getErrorCount() + " errors");  

            }  

            else {  

                logger.debug("Validator found no errors");  

            }  

        }  

    }  

 

 Interface:org.springframework.validation.Validator

Java代码  


public interface Validator {  

    boolean supports(Class clazz);  

    void validate(Object target, Errors errors);  

  

}  

 Class:UserValidator

Java代码  


public class UserValidator implements Validator {  

  

    @Override  

    public boolean supports(Class clazz) {  

        return User.class.equals(clazz);  

    }  

  

    @Override  

    public void validate(Object target, Errors errors) {  

        User user = (User) target;  

        if (!StringUtils.hasLength(user.getUsername())) {  

            errors.rejectValue("username", "", "登录编码必须填写!");  

        }  

        if (!StringUtils.hasLength(user.getPassword())) {  

            errors.rejectValue("password", "", "登录密码必须填写!");  

        }  

        if (!StringUtils.hasLength(user.getName())) {  

            errors.rejectValue("name", "", "用户姓名必须填写!");  

        }  

    }  

  

}  

Class:HarmlessHandleValidator

Java代码  


public class HarmlessHandleValidator implements Validator {  

  

    @Override  

    public boolean supports(Class clazz) {  

        return HarmlessHandle.class.equals(clazz);  

    }  

  

    @Override  

    public void validate(Object target, Errors errors) {  

        HarmlessHandle harmlessHandle = (HarmlessHandle) target;  

        if (!StringUtils.hasLength(harmlessHandle.getHandleNo())) {  

            errors.rejectValue("handleNo", "", "编码必须填写!");  

        }  

        if (!StringUtils.hasLength(harmlessHandle.getHandleName())) {  

            errors.rejectValue("handleName", "", "名称必须填写!");  

        }  

    }  

  

}  

 

调用各自的validate策略

Java代码  


ValidationUtils.invokeValidator(new UserValidator(), user, errors);  

 

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

 

over^^

转载于:http://liuxi1024.iteye.com/blog/583145#comments
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uml 设计模式