`
liuxi1024
  • 浏览: 390977 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

策略模式(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
分享到:
评论
1 楼 kingj 2014-01-07  
和工厂模式有何区别呢

相关推荐

    spring-framework-1.0-m1.zip源码

    本文将深入探讨Spring 1.0源码,帮助读者理解其设计理念和核心机制,以便更好地运用和定制这一经典框架。 一、Spring框架概述 Spring框架是Rod Johnson在2003年推出的,它旨在简化Java企业级应用程序的开发。1.0...

    spring源码-2022-08-14spring源码spring源码spring源码

    在2022年8月14日更新的Spring源码中,我们可以深入理解其设计理念和实现机制。 Spring框架的主要组成部分包括: 1. **核心容器**:这是Spring的基础,主要包括BeanFactory和ApplicationContext。BeanFactory负责...

    sprintboot-strategy-pattern-demo-master.zip

    【标题】"sprintboot-strategy-pattern-demo-master.zip" 是一个使用Spring Boot技术实现的策略模式示例项目,它提供了一种快速理解并应用策略模式的开箱即用的体验。 【描述】"基于springboot做了一个策略模式的...

    spring-security-web源码所需jar包

    10. **spring-security-config-3.1.2.RELEASE.jar**:提供了基于XML或Java的配置方式,用于定义安全规则和策略,如定义访问控制列表,自定义过滤器链等。 通过以上这些jar包,我们可以深入研究Spring Security Web...

    A Problem-Solution Approach Spring 源码和书

    Spring作为Java领域最流行的轻量级框架,它的广泛使用使得深入理解其源码和设计理念变得至关重要。 Spring框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切面编程(Aspect-Oriented Programming,...

    spring 源码中文注释

    Spring框架是Java开发中最广泛应用的轻量级框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。这份"spring 源码...

    最新设计模式超级详解+Tomcat架构源码分析+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光盘源码.rar精通Java EE项目案例-基于Eclipse Spring Struts Hibernate光盘源码....

    spring-session-1.2.1 源码

    spring-session-1.2.1 源码spring-session-1.2.1 源码spring-session-1.2.1 源码

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接3.zip

    50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接4.zip

    50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接2.zip

    50 Spring源码中的常见的设计模式 - 单例模式的误区(享元模式).mp4 51 Spring源码中的常见的设计模式 - 模板方法模式.mp4 52 Spring源码中的常见的设计模式 - 代理模式.mp4 53 Spring源码中的常见的设计模式 - ...

    阿里P7美团T8大咖带你学习Spring5源码 视频教程 下载 百度网盘链接1.zip

    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的社区论坛源码.zip毕业设计-基于Spring Boot的社区论坛源码....

    Spring下使用策略模式

    在Spring框架中,策略模式是一种常见的设计模式,它允许我们定义一组可互换的策略,这些策略可以在运行时根据需求动态选择。这篇文章将深入探讨如何在Spring中运用策略模式,并结合源码分析其工作原理。 策略模式的...

    Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar

    在本案例中,"Spring源码编译缺少的两个包:spring-cglib-repack-3.2.0.jar和spring-objenesis-repack-2.2.jar"揭示了这两个关键的库对于Spring源码编译是必不可少的。下面将详细讲解这两个库的作用及其在Spring中的...

    spring源码注释中文

    Spring 框架是 Java 开发中的一个核心组件,它为构建可维护、模块化和松耦合的应用程序提供了一种强大的方式。Spring 源码注释中文版的提供,使得开发者能够更加深入地理解 Spring 的工作原理,无需经过复杂的编译...

    spring-security-oauth2源码

    Spring Security OAuth2 是一个强大的框架,用于为Java应用提供OAuth2和OpenID Connect...通过阅读和分析`spring-security-oauth-master`中的源码,可以更深入地了解其实现细节,有助于在实际项目中灵活运用和定制。

    Spring-context4.1.0的源码

    Spring-context4.1.0的源码,我们在学习Spring源码时,可以在ide中添加源码方便追溯运行过程

    spring1.2.6源码

    通过阅读和分析Spring 1.2.6的源码,不仅可以学习到Spring的核心设计原则,还能了解到设计模式的运用,例如工厂模式、单例模式、观察者模式等。同时,这也是提升Java编程技巧和理解框架底层运作的好机会。在实际的...

Global site tag (gtag.js) - Google Analytics