1. 程式人生 > >設計模式--spring原始碼中使用策略模式(Strategy Pattern)

設計模式--spring原始碼中使用策略模式(Strategy Pattern)

策略模式(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. }  

 Class:UserValidator

Java程式碼  收藏程式碼
  1. public class UserValidator implements Validator {  
  2.     @Override  
  3.     public boolean supports(Class clazz) {  
  4.         return User.class.equals(clazz);  
  5.     }  
  6.     @Override  
  7.     public void validate(Object target, Errors errors) {  
  8.         User user = (User) target;  
  9.         if (!StringUtils.hasLength(user.getUsername())) {  
  10.             errors.rejectValue("username""""登入編碼必須填寫!");  
  11.         }  
  12.         if (!StringUtils.hasLength(user.getPassword())) {  
  13.             errors.rejectValue("password""""登入密碼必須填寫!");  
  14.         }  
  15.         if (!StringUtils.hasLength(user.getName())) {  
  16.             errors.rejectValue("name""""使用者姓名必須填寫!");  
  17.         }  
  18.     }  
  19. }  

Class:HarmlessHandleValidator

Java程式碼  收藏程式碼
  1. public class HarmlessHandleValidator implements Validator {  
  2.     @Override  
  3.     public boolean supports(Class clazz) {  
  4.         return HarmlessHandle.class.equals(clazz);  
  5.     }  
  6.     @Override  
  7.     public void validate(Object target, Errors errors) {  
  8.         HarmlessHandle harmlessHandle = (HarmlessHandle) target;  
  9.         if (!StringUtils.hasLength(harmlessHandle.getHandleNo())) {  
  10.             errors.rejectValue("handleNo""""編碼必須填寫!");  
  11.         }  
  12.         if (!StringUtils.hasLength(harmlessHandle.getHandleName())) {  
  13.             errors.rejectValue("handleName""""名稱必須填寫!");  
  14.         }  
  15.     }  
  16. }  

呼叫各自的validate策略

Java程式碼  收藏程式碼
  1. ValidationUtils.invokeValidator(new UserValidator(), user, errors);  

3、策略模式的本質:少用繼承,多用組合

over^^

轉載於:http://liuxi1024.iteye.com/blog/583145#comments