【設計模式】Java服務開發應用策略模式的一個例子
當我們寫程式碼時遇到了需要if else 需要實現的問題時,就可以考慮是否引入某種設計模式,能讓程式碼寫得更加graceful。
假設我們現在有個設計使用者查詢的RESTful介面的需求,使用者可能有多個屬性,有id,firstName ,lastName,age,adress 等等,我們可以這樣一個介面:
http://localhost:8099/api?method=petclinic.owner.get&version=1.0&key=id&value=1&format=json
key值表示我們可以根據什麼來查詢,比如根據id來查詢,則key為id,根據lastName來查詢,則key為lastName。value則為對應的值。
介面規則設定好後,則需要進行後端controller層的編碼工作了。
@ServiceMethod(value = "petclinic.owner.get", version = "1.0")
public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){
//TODO:
}
key值可以取不同的值,我們自然想到這樣的處理方式。
下面是基於if else的TODO部分實現
@ServiceMethod(value = "petclinic.owner.get", version = "1.0")
public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){
//TODO:
if(key.equals("id")){
//呼叫業務層方法findOwnerById獲取使用者列表
return clinicBll.findOwnerById(value);
}else if(key.equals("lastName"){
//呼叫業務層方法findOwnerByLastName獲取使用者列表
return clinicBll.findOwnerByLastName(value);
}
}
如果用策略模式該重構程式碼,則我們先需要抽象一個找使用者的策略(是根據id來找?還是根據lastName來找?等等)。
package com.iflytek.petclinic.service.strategy;
import com.iflytek.petclinic.model.Owner;
import org.springframework.dao.DataAccessException;
import java.util.Collection;
public interface FindOwnerStrategy {
Collection<Owner> findOwner(String value) throws DataAccessException;
}
我們可以根據具體的找使用者策略來實現不同的策略類。
下面是根據id來找的策略:
package com.iflytek.petclinic.service.strategy.impl;
import com.iflytek.petclinic.bll.ClinicBll;
import com.iflytek.petclinic.model.Owner;
import com.iflytek.petclinic.service.strategy.FindOwnerStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import java.util.Collection;
public class FindOwnerByIdStrategy implements FindOwnerStrategy {
@Autowired
private ClinicBll clinicBll;
public Collection<Owner> findOwner (String value) throws DataAccessException{
return clinicBll.findOwnerById(value);
}
}
下面是根據lastName來找的策略:
package com.iflytek.petclinic.service.strategy.impl;
import com.iflytek.petclinic.bll.ClinicBll;
import com.iflytek.petclinic.model.Owner;
import com.iflytek.petclinic.service.strategy.FindOwnerStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import java.util.Collection;
public class FindOwnerByLastNameStrategy implements FindOwnerStrategy {
@Autowired
private ClinicBll clinicBll;
public Collection<Owner> findOwner(String value) throws DataAccessException{
return clinicBll.findOwnerByLastName(value);
}
}
這樣,我們在原來TODO的地方可以這樣處理
@RestController
public class OwnerService {
@Resource(name = "findOwnerStrategyMap")
private Map<String, FindOwnerStrategy> findOwnerStrategyMap ;
@ServiceMethod(value = "petclinic.owner.get", version = "1.0")
public Collection<Owner> getOwner (@RequestParam String key,@RequestParam String value){
FindOwnerStrategy findOwnerStrategy = findOwnerStrategyMap.get(key);
return findOwnerStrategy.findOwner(value);
}
}
這裡的findOwnerStrategyMap是個hashmap,key為策略名稱,這裡是id,loginName等等,value則為對應策略類例項的引用。具體在xml中配置。因為本文主要說的是策略模式,這些就略過了。
相關文章
- 設計模式 | 策略模式及典型應用設計模式
- 設計模式在 TypeScript 中的應用 – 策略模式設計模式TypeScript
- 每天一個設計模式·策略模式設計模式
- 我的Java設計模式-策略模式Java設計模式
- JAVA設計模式之策略模式Java設計模式
- Java設計模式-策略模式分析Java設計模式
- Java設計模式6:策略模式Java設計模式
- 設計模式(一) 策略模式設計模式
- 【技巧篇】JavaScript設計模式之策略模式應用JavaScript設計模式
- 設計模式之--策略模式及其在JDK中的應用設計模式JDK
- Java設計模式之策略模式示例Java設計模式
- Java設計模式之(十四)——策略模式Java設計模式
- Java設計模式之策略模式(Strategy)Java設計模式
- 設計模式(一) 支付策略模式設計模式
- 服務設計的原則:服務模式與反模式模式
- 【java設計模式】(7)---策略模式(案例解析)Java設計模式
- Java設計模式之策略模式詳解Java設計模式
- 《JavaScript設計模式與開發實踐》模式篇(2)—— 策略模式JavaScript設計模式
- Java設計模式——觀察者模式的靈活應用Java設計模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- 設計模式🔫---策略模式設計模式
- Laravel - 服務設計模式Laravel設計模式
- Java設計模式實現之二--策略模式Java設計模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- 設計模式之策略模式設計模式
- js設計模式--策略模式JS設計模式
- 小白設計模式:策略模式設計模式
- 設計模式之【策略模式】設計模式
- php設計模式–策略模式PHP設計模式
- 設計模式(八)——策略模式設計模式
- 設計模式(四):策略模式設計模式
- 設計模式-策略模式(轉)設計模式
- 【設計模式之策略模式】設計模式
- Java列舉的策略設計模式 -DEVJava設計模式dev
- 設計模式 #5 (策略模式、代理模式)設計模式
- 設計模式,及在Java中的應用設計模式Java