博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式--spring源码中使用策略模式(Strategy Pattern)
阅读量:6006 次
发布时间:2019-06-20

本文共 2479 字,大约阅读时间需要 8 分钟。

转载  

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

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

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

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

1、UML图说明

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

2、类和接口代码

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

Java代码  
  1. public static void invokeValidator(Validator validator, Object obj, Errors errors) {  
  2.         Assert.notNull(validator, "Validator must not be null");  
  3.         Assert.notNull(errors, "Errors object must not be null");  
  4.         if (logger.isDebugEnabled()) {  
  5.             logger.debug("Invoking validator [" + validator + "]");  
  6.         }  
  7.         if (obj != null && !validator.supports(obj.getClass())) {  
  8.             throw new IllegalArgumentException(  
  9.                     "Validator [" + validator.getClass() + "] does not support [" + obj.getClass() + "]");  
  10.         }  
  11.         validator.validate(obj, errors);  
  12.         if (logger.isDebugEnabled()) {  
  13.             if (errors.hasErrors()) {  
  14.                 logger.debug("Validator found " + errors.getErrorCount() + " errors");  
  15.             }  
  16.             else {  
  17.                 logger.debug("Validator found no errors");  
  18.             }  
  19.         }  
  20.     }  
 

 Interface:org.springframework.validation.Validator

Java代码  
  1. public interface Validator {  
  2.     boolean supports(Class clazz);  
  3.     void validate(Object target, Errors errors);  
  4.   
  5. }  

 Class:UserValidator

Java代码  
  1. public class UserValidator implements Validator {  
  2.   
  3.     @Override  
  4.     public boolean supports(Class clazz) {  
  5.         return User.class.equals(clazz);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void validate(Object target, Errors errors) {  
  10.         User user = (User) target;  
  11.         if (!StringUtils.hasLength(user.getUsername())) {  
  12.             errors.rejectValue("username", "", "登录编码必须填写!");  
  13.         }  
  14.         if (!StringUtils.hasLength(user.getPassword())) {  
  15.             errors.rejectValue("password", "", "登录密码必须填写!");  
  16.         }  
  17.         if (!StringUtils.hasLength(user.getName())) {  
  18.             errors.rejectValue("name", "", "用户姓名必须填写!");  
  19.         }  
  20.     }  
  21.   
  22. }  

Class:HarmlessHandleValidator

Java代码  
  1. public class HarmlessHandleValidator implements Validator {  
  2.   
  3.     @Override  
  4.     public boolean supports(Class clazz) {  
  5.         return HarmlessHandle.class.equals(clazz);  
  6.     }  
  7.   
  8.     @Override  
  9.     public void validate(Object target, Errors errors) {  
  10.         HarmlessHandle harmlessHandle = (HarmlessHandle) target;  
  11.         if (!StringUtils.hasLength(harmlessHandle.getHandleNo())) {  
  12.             errors.rejectValue("handleNo", "", "编码必须填写!");  
  13.         }  
  14.         if (!StringUtils.hasLength(harmlessHandle.getHandleName())) {  
  15.             errors.rejectValue("handleName", "", "名称必须填写!");  
  16.         }  
  17.     }  
  18.   
  19. }  
 

调用各自的validate策略

Java代码  
  1. ValidationUtils.invokeValidator(new UserValidator(), user, errors);  

 

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

 

over^^

你可能感兴趣的文章
网络管理工具与IT运维管理平台的差别
查看>>
五一期间安全回顾 木马威胁提升 移动设备数据泄漏受重视
查看>>
VDI序曲二十 桌面虚拟化和RemoteApp集成到SharePoint 2010里
查看>>
oracle里long类型的总结
查看>>
10种有用的CSS技巧
查看>>
服务端接口中的那些坑
查看>>
MySql like 查询 变向写法(不用like 完成like查询)
查看>>
Struts 笔记
查看>>
《C++面向对象高效编程(第2版)》——2.2 对象接口的重要性
查看>>
五个 ping 工具的使用实例
查看>>
在Linux系统下玩《炉石传说:魔兽英雄传》
查看>>
阿里数据库内核月报:2016年01月
查看>>
Samba 系列(七):在 Samba AD DC 服务器上创建共享目录并映射到 Windows/Linux 客户...
查看>>
The Joy of Clojure – Clojure philosophy(1)
查看>>
Apache Storm 官方文档 —— 多语言接口协议
查看>>
在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用
查看>>
小白学数据:一文看懂NoSQL数据库
查看>>
阿里云ApsaraDB RDS用户 - OLAP最佳实践
查看>>
菜鸟学Linux命令:Chmod命令和数字文件权限
查看>>
设置AFNetworking网络请求的超时时间
查看>>