【設計模式】Java服務開發應用策略模式的一個例子

pengfoo發表於2016-03-28

當我們寫程式碼時遇到了需要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中配置。因為本文主要說的是策略模式,這些就略過了。













相關文章