设计模式--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
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
下面使用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
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- UML类图中的六种关系
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用