策略模式在工作中應用

2021-10-04 17:43:53 字數 2907 閱讀 1782

物流系統要新增包裹資料,現在物流的上游有三種包裹:線上的包裹,線下的包裹,外部的包裹,每種包裹在新增時會有些不同的操作,比如線上線下的包裹新增後要發訊息給訂單履約中心方便監控,線上包裹新增時要判斷包裹是否需要抽檢,釘箱,並生成相關的資料等。

每種包裹都有其特殊的操作,從系統維護的角度上說,可以使用策略模式來新增包裹,方便後期的維護,如果後期線上包裹需要多一些操作,那只改線上包裹的新增策略即可,測試也只用回歸線上包裹。

當然對於三種包裹公共的部分,需要放到乙個公共類裡,統一維護。

**結構:

1.寫乙個策略模版的接囗:packagesyncstrategy

/**

* 包裹同步策略

*/public

inte***ce

packagesyncstrategy

transportpackagedto是乙個包裹類,

resultdto是乙個結果的封裝類,可替換成自己公司的結果類,或者替換成string,boolean都可以。

針對策略型別還可以再封裝乙個接囗:basestrategy,使其更通用(別的地方可能也會用到策略模式),例如

public

inte***ce

basestrategy

<

t>

然後改寫上面的策略模版packagesyncstrategy:

/**

* 包裹同步策略

*/public

inte***ce

packagesyncstrategy

extends

basestrategy

是不是更簡潔了

其中列舉:ordertypeenum(根據自己的業務來建立時映列舉,我們的包裹是從訂單維度來區分的,而且只分了三種)

public

enum ordertypeenum

}

2.開始寫各種包裹的新增策略(具體邏輯省略,打了一句日誌代替了):

a.線上包裹新增策略:

/**

* 線上包裹同步策略

*/@slf4j

@service

public

class

onlinepackagesyncstrategy

implements

packagesyncstrategy

@override

public resultdto syncpackageinfo

(transportpackagedto packagedto)

}

b.線下包裹新增策略:

/**

* 線下包裹同步策略

*/@slf4j

@service

public

class

offlinepackagesyncstrategy

implements

packagesyncstrategy

@override

public resultdto syncpackageinfo

(transportpackagedto packagedto)

}

c.外部包裹新增策略:

/**

* 外部包裹包裹同步策略

*/@slf4j

@service

public

class

outerpackagesyncstrategy

implements

packagesyncstrategy

@override

public resultdto syncpackageinfo

(transportpackagedto packagedto)

}

3.最後編寫測試類:

public

class

packagecreatetest

extends

basetest

optional optional = packagesyncstrategies.

stream()

.filter

(o -

> o.

getstrategy()

.equals

(packagedto.

getordertype()

)).findfirst()

;if(!optional.

ispresent()

)的包裹資料同步策略"

, packagedto.

getordertype()

.gettype()

);return;}

resultdto resultdto = optional.

get().

syncpackageinfo

(packagedto)

; log.

info

("新增包裹的結果:"

+resultdto);}

}

這裡看不懂的多看看就明白了

4.執行結果:

線下包裹新增資料開始

新增包裹的結果:resultdto

(model=

null

, success=

true

, errorcode=

0, errormsg=

null

)

策略模式在工作中的應用

最近在日常工作過程中接到乙個任務 需要提供乙個介面,根據不同的意圖返回給客服端不同的答案,每個意圖去識別答案的演算法都有各自不同的邏輯。作為乙個合格的crud程式設計師,接到這個需求腦袋裡的第一反應就是用if else去實現,但是這樣寫 太醜陋了,每個else裡面都會有大量的業務邏輯,對於後期接坑的...

責任鏈模式在工作中應用

判斷配件是否需要抽檢,現在系統有三種抽檢規則 商品規則,組織規則,其它規則,配件滿足任一規則即需要抽檢 因為配件要依次經過三種規則,所以考慮使用責任鏈模式 讓配件依次匹配商品規則,組織規則,其它規則,滿足任一規則即返回,不滿足繼續用下一規則判斷。結構 1.策略模版,建立乙個抽象類 commonins...

設計模式在工作中的應用(二)

這裡我們不介紹如何進行解析生成sql語句,怎麼解析的不重要,只要知道這些都是解析類,轉換為sql語句的不同部分。我是想說說針對上面的需求,我是如何考慮的。需要能夠使用sqlserver的函式?大概想一想,感覺很容易啊,不就是封裝乙個函式類,實現sqlserver資料庫的函式。是的,最根本的實現也就是...