设计模式--spring源码中使用策略模式(Strategy Pattern)
来源:互联网 发布:男士护肤推荐 知乎 编辑:程序博客网 时间:2024/06/08 14:21
策略模式(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^^
转载于:http://liuxi1024.iteye.com/blog/583145#comments
0 0
- 设计模式--spring源码中使用策略模式(Strategy Pattern)
- 设计模式:策略模式(Strategy Pattern)
- 设计模式----策略模式(Strategy Pattern)
- 【设计模式】策略模式(Strategy Pattern)
- 设计模式 - Strategy Pattern(策略模式)
- 设计模式 - Strategy Pattern(策略模式)
- 设计模式20:Strategy Pattern (策略模式)
- 设计模式-策略模式(Strategy Pattern)
- 设计模式:策略模式 strategy pattern
- java设计模式---Strategy Pattern---策略模式
- 设计模式之策略模式(Strategy Pattern)
- [设计模式]Strategy Pattern(策略模式).(1)
- 设计模式-策略模式(Strategy Pattern)
- c++设计模式:策略模式(Strategy Pattern)
- 设计模式学习--策略模式(Strategy Pattern)
- 设计模式原来如此-策略模式(Strategy Pattern)
- 设计模式-策略模式 Strategy Pattern
- 设计模式 - 策略模式(Strategy Pattern) 详解
- MFC改变编辑框背景、字体、颜色等
- C++根据扩展名获取文件图标、类型
- Android中使用aidl在进程间通信(IPC)
- 数据结构总结---树
- android-----View工作原理系列(一)
- 设计模式--spring源码中使用策略模式(Strategy Pattern)
- 如何判断程序是否重复运行的几种方法
- BCE0004: Ambiguous reference 'preview': CameraMotionBlurEditor.preview, UnityEditor.Editor.preview.
- 成员变量、类变量、局部变量的区别
- 原生下拉刷新SwipeRefreshLayout的使用
- win7 安装ubuntu14.04 双系统 加hisi3531 交叉编译移植
- 剑指offer-3-面试14:调整数组顺序使奇数位于偶数前面
- UIButton和UILabel的宽与高
- 计算给定时间与现在的时间差