策略模式(Strategy Pattern)中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。策略模式的定义如下:
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
下面使用spring中源码说明策略模式(spring validation)
1、UML图说明
说明:UserValidator、HarmlessHandleValidator 分别为两个行为策略,实现不同的算法。
2、类和接口代码
Class: org.springframework.validation.ValidationUtils 验证工具类
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
public interface Validator {
boolean supports(Class clazz);
void validate(Object target, Errors errors);
}
Class:UserValidator
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
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策略
ValidationUtils.invokeValidator(new UserValidator(), user, errors);
3、策略模式的本质:少用继承,多用组合
over^^
- 大小: 18 KB
分享到:
相关推荐
本文将深入探讨Spring 1.0源码,帮助读者理解其设计理念和核心机制,以便更好地运用和定制这一经典框架。 一、Spring框架概述 Spring框架是Rod Johnson在2003年推出的,它旨在简化Java企业级应用程序的开发。1.0...
在2022年8月14日更新的Spring源码中,我们可以深入理解其设计理念和实现机制。 Spring框架的主要组成部分包括: 1. **核心容器**:这是Spring的基础,主要包括BeanFactory和ApplicationContext。BeanFactory负责...
【标题】"sprintboot-strategy-pattern-demo-master.zip" 是一个使用Spring Boot技术实现的策略模式示例项目,它提供了一种快速理解并应用策略模式的开箱即用的体验。 【描述】"基于springboot做了一个策略模式的...
10. **spring-security-config-3.1.2.RELEASE.jar**:提供了基于XML或Java的配置方式,用于定义安全规则和策略,如定义访问控制列表,自定义过滤器链等。 通过以上这些jar包,我们可以深入研究Spring Security Web...
Spring作为Java领域最流行的轻量级框架,它的广泛使用使得深入理解其源码和设计理念变得至关重要。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,...
Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。这份"spring 源码...
Spring源码分析,web源码分析,Tomcat架构源码分析都是非常深入的源码级课程,期待研究设计模式和深入学习源码内功的朋友们,一定要仔细的学习研究。 (0);目录中文件数:1个 ├─3.代码.zip (1)\1.笔记;目录中文...
精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码.rar精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码.rar精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码....
spring-session-1.2.1 源码spring-session-1.2.1 源码spring-session-1.2.1 源码
50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...
50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...
50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...
50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...
基于Spring Boot的社区论坛源码.zip毕业设计-基于Spring Boot的社区论坛源码.zip毕业设计-基于Spring Boot的社区论坛源码.zip毕业设计-基于Spring Boot的社区论坛源码.zip毕业设计-基于Spring Boot的社区论坛源码....
在Spring框架中,策略模式是一种常见的设计模式,它允许我们定义一组可互换的策略,这些策略可以在运行时根据需求动态选择。这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的...
在本案例中,"Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar"揭示了这两个关键的库对于Spring源码编译是必不可少的。下面将详细讲解这两个库的作用及其在Spring中的...
Spring 框架是 Java 开发中的一个核心组件,它为构建可维护、模块化和松耦合的应用程序提供了一种强大的方式。Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译...
Spring Security OAuth2 是一个强大的框架,用于为Java应用提供OAuth2和OpenID Connect...通过阅读和分析`spring-security-oauth-master`中的源码,可以更深入地了解其实现细节,有助于在实际项目中灵活运用和定制。
Spring-context4.1.0的源码,我们在学习Spring源码时,可以在ide中添加源码方便追溯运行过程
通过阅读和分析Spring 1.2.6的源码,不仅可以学习到Spring的核心设计原则,还能了解到设计模式的运用,例如工厂模式、单例模式、观察者模式等。同时,这也是提升Java编程技巧和理解框架底层运作的好机会。在实际的...