1. 程式人生 > >【設計模式】Java服務開發應用策略模式的一個例子

【設計模式】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中配置。因為本文主要說的是策略模式,這些就略過了。













相關推薦

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

當我們寫程式碼時遇到了需要if else 需要實現的問題時,就可以考慮是否引入某種設計模式,能讓程式碼寫得更加graceful。 假設我們現在有個設計使用者查詢的RESTful介面的需求,使用者可能有多個屬性,有id,firstName ,lastName,age,adr

解決辦法JAVA服務端解決跨域問題 CORS請求頭方式

最近與前端進行本地聯調時,發生了跨域的問題,無法訪問我的服務端地址,使用了以下的方式進行了解決。 解決的辦法是通過fileter中寫入ACCESS-Control-Allow的頭資訊,進行跨域訪問,程式碼如下: public class CrossDomainFilter

java學習筆記淺析JavaWeb開發中Model1模式和Model2模式

Model1模式   JavaBean就是java類,JavaBean分兩類:一類是實體Bean,一類是業務Bean model1模式優點:執行效率高,開發效率比較高,適合小型專案 model1模式缺點:邏輯比較混亂,頁面混亂,維護困難,擴充套件不容易   Model2模式

棋牌遊戲JAVA伺服器設計開發(一)

####開篇語 大概在16年時候,新型房卡模式開啟棋牌遊戲新里程,整個棋牌行業迅速改變模式,出現近兩三年激烈的競爭景象,據統計全國大大小小棋牌遊戲公司,專職棋牌公司近兩萬多家,這都不算後起大大小小遊戲公司加緊棋牌研發行列。新型棋牌模式有一個很明顯的特點,那就是地

設計模式Java中的23種設計模式與7大原則

Java中的23種設計模式與7大原則建立型模式 5抽象工廠模式(Abstract factory pattern): 提供一個介面, 用於建立相關或依賴物件的家族, 而不需要指定具體類.生成器模式(Bu

java設計模式之 代理(Proxy)模式

代理模式的核心作用就是通過代理,控制對物件的訪問。這跟實際中是一樣的,比如說明星都有經紀人,這就是一個代理,比如有人要找某明星拍戲,那麼首先處理這事的是他的經紀人,雖然拍戲需要自己拍,但是拍戲前後的一些必須要做的事等等,都由這個經紀人來處理。    在程式中也是如此,通過

分享Java後臺開發精選知識圖譜

僅支持 jqgrid lai content 結果集 完全 異常處理 分布式服務 list 地址 引言: 學習一個新的技術時,其實不在於跟著某個教程敲出了幾行、幾百行代碼,這樣你最多只能知其然而不知其所以然,進步緩慢且深度有限,最重要的是一開始就對整個學習路線有宏觀、簡潔的

名師課堂Java面向對象開發

runt 簡介 方法 抽象類與接口的區別 寵物 引用 裝箱 數據表 view 課程介紹 面向對象是Java語言之中最為重要的特征,本課程主要講解面向對象的核心知識,並且利用大量的代碼、數據結構課程深入分析Java面向對象特征。 課程目標 掌握Java面向對象開發技術

外掛釋出JAVA服務框架,Jeecg-P3-Demo 1.0.0 外掛開源釋出

JAVA微服務框架,Jeecg-P3-Demo 1.0.0 外掛開源釋出 Jeecg-P3-Demo專案,採用JEECG-P3微服務框架技術,做了幾個常見Demo功能案例:普通列表、樹列表、一對多列表、產品管理(bootstrap-talbe列表)等功能,為大家快速瞭解使用P3微服務

原始碼分享java實現對接簡訊驗證碼應用功能

今天公司提出一個需求,要在現有專案上收集註冊使用者的真實手機號,由於之前沒有接觸過這一塊,只能尋求度孃的幫助,經過一天的努力,終於完成了,現整理記錄下已備查閱。 1 解決方案:在註冊時要求使用者進行手機驗證。2 尋找簡訊供應商:由於對這一塊不是太懂,大學同學推薦一家他們公司在用的給我。3 程式碼實現 首先到

設計原則軟體設計模式六大原則---學習

又有一種說法:   http://www.cnblogs.com/yuanhailiang/p/9432198.html ———————————————————————————— 原文:https://www.cnblogs.com/zhanghengscnc/p/8299

設計模式(一)-簡單工廠模式策略模式

前言 最近開始和春哥,張鐸 ,銀平討論設計模式,成立了一個小菜變大鳥的小組,每天討論一個模式,並且把這個模式搞懂,每學一個新的模式,再回顧一下之前學的模式。這兩天學了簡單工廠模式和策略模式,發現兩個模式有很多相同之處,下面用商場促銷的例子來對兩個模式總結一下。 簡單工廠模式 1.

外掛釋出JAVA服務框架,Jeecg-P3-Base-System 1.0.0 外掛開源釋出

JAVA微服務框架,Jeecg-P3-Base-System 1.0.0 外掛開源釋出 系統管理外掛,採用JEECG-P3微服務框架技術,實現了P3外掛平臺支撐的基礎功能:使用者管理,角色管理、選單管理等功能。 實現許可權攔截器,在jeecg-p3-starter-web

Java 單例模式Java 單例模式在多執行緒環境中可能存在的問題

在多執行緒環境下,使用延遲載入的方式實現單例模式,會出現錯誤。 例如,使用如下方式實現單例類: package study20170307; /** * Created by apple on 17/3/7. */ public class Sin

問題記錄JAVA程序啟動大概率卡住6分鐘左右,應用日誌沒有任何WARN ERROR,系統日誌也沒有發現和程序相關日誌,最後定位TOMCAT SHA1PRNG耗時太長

系統是基於springboot開發的系統,java -jar啟動過程中發現經常會卡住6分鐘左右,才能啟動完成,全程沒有發現任何WANR和ERROR級別的日誌(其實早看看DEBUG和INFO日誌,可能問題早就解決了,慣性思維害人啊),再去檢視/var/log/message系統日誌,也沒發現任何和

設計優化- 正確使用 Value Object 模式

在J2EE 軟體開發中,通常會對系統模組進行分層,如下圖所示: 展示層主要負責資料的展示,業務路基層負責具體的業務邏輯處理,而持久層負責資料庫等持久化操作。 大型系統中,這些層次很有可能會被分離,部署在不同的伺服器上。而在兩個層次之間可能通過遠端呼叫 RMI 等方式進行

設計模式Observer(觀察者)模式----物件行為模式

1,意圖     定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知 並 被自動更新。 2,別名     依賴(Dependents),釋出-訂閱模式(Publish-Subscribe) 3,動機  

6 android 服務應用 startService 和bindService

最基本的應用那就開啟和關閉了 我們這裡寫一個demo 並講解一下兩個開啟(StartService,BindService)有什麼區別 package com.zy.servicesdemo; import android.content.ComponentName;

Vue 入門使用 Vue2 開發一個展示專案列表的應用

前言 一直沒有找到一個合適的展示個人專案的模板,所以自己動手使用 Vue 寫了一個。該模板基於 Markdown 檔案進行配置,只需要按一定規則編寫 Markdown 檔案,然後使用一個 線上工具 轉為 JSON 檔案即可。下面是該專案的線上地址和原始碼。本文

TaipJava快速開發騰訊人工智慧AI接入

TAIP 是呼叫騰訊 AI 介面的 Java 客戶端,為呼叫騰訊 AI 功能的開發人員提供了一系列的互動方法。 Java呼叫騰訊AI介面服務。鑑權實現 Java快速開發第三方——騰訊人工智慧AI接入詳解SDK形式 APPID APPKEY 是騰訊AI建立應用後得