設計模式在我工作中的實踐
阿新 • • 發佈:2020-04-05
大多數時候我都是寫一些業務程式碼,可能一堆CRUD就能解決問題,但是這樣的工作對技術人的提升並不多,如何讓自己從業務中解脫出來找到寫程式碼的樂趣呢,我做過一些嘗試,使用設計模式改善自己的業務程式碼就是其中的一種。
## 設計模式實踐
### 責任鏈設計模式
#### 責任鏈設計模式定義
請求在一個鏈條上處理,鏈條上的受理者處理完畢之後決定是繼續往後傳遞還是中斷當前處理流程。
#### 適用場景
適用於多節點的流程處理,每個節點完成各自負責的部分,節點之間不知道彼此的存在,比如OA的審批流,java web開發中的Filter機制。舉一個生活中的例子,筆者之前租房的時候遇到了所謂的黑中介,租的時候感覺自己是上帝,但是壞了東西找他修的時候就像個孫子一樣,中介讓我找門店客服,門店客服又讓我找房東,房東又讓我找她家老公,最終好說歹說才把這事了了(租房一定要找正規中介)。
#### 實踐經驗
筆者目前所做的業務是校園團餐的聚合支付,業務流程很簡單,1.學生開啟手機付款碼支付,2.食堂大媽使用機具掃付款碼收款。大學食堂有個背景是這樣的,食堂有補貼,菜品比較便宜,所以學校是不願意讓社會人士去學校食堂消費的,鑑於此,我們在支付之前加了一套是否允許支付的檢驗邏輯,大體如下:
1.某檔口只允許某類使用者使用者消費,比如教師檔口只允許教師消費,學生檔口不允許校外使用者消費;
2.某個檔口一天只允許某類使用者消費幾次,比如教師食堂一天只允許學生消費一次;
3.是否允許非清真學生消費,比如某些清真餐廳,是不允許非清真學生消費的;
針對這幾類情況我建立了三類過濾器,分別是:
SpecificCardUserConsumeLimitFilter:按使用者型別判斷是否允許消費
DayConsumeTimesConsumeLimitFilter:按日消費次數判斷是否允許消費
MuslimConsumeLimitFilter:非清真使用者是否允許消費
判斷邏輯是先通過SpecificCardUserConsumeLimitFilter判斷當前使用者是否可以在此檔口消費,如果允許繼續由DayConsumeTimesConsumeLimitFilter判斷當天消費次數是否已用完,如果未用完繼續由MuslimConsumeLimitFilter判斷當前使用者是否滿足清真餐廳的就餐條件,前面三條判斷,只要有一個不滿足就提前返回。
部分程式碼如下:
```
public boolean canConsume(String uid,String shopId,String supplierId){
//獲取使用者資訊,使用者資訊包含型別(student:學生,teacher:老師,unknown:未知使用者)、名族(han:漢族,mg:蒙古族)
UserInfo userInfo = getUserInfo(uid);
//獲取消費限制資訊,限制資訊包含是否允許非清真消費、每種型別的使用者是否允許消費以及允許消費的次數
ConsumeConfigInfo consumeConfigInfo = getConsumeConfigInfo(shopId,supplierId)
// 構造消費限制過濾器鏈條
ConsumeLimitFilterChain filterChain = new ConsumeLimitFilterChain();
filterChain.addFilter(new SpecificCardUserConsumeLimitFilter());
filterChain.addFilter(new DayConsumeTimesConsumeLimitFilter());
filterChain.addFilter(new MuslimConsumeLimitFilter());
boolean checkResult = filterChain.doFilter(filterChain, schoolMemberInfo, consumeConfigInfo);
//filterChain.doFilter方法
public boolean doFilter(ConsumeLimitFilterChain filterChain,UserInfo userInfo,
ConsumeConfigInfo consumeConfigInfo ){
//迭代呼叫過濾器