在日常開發中,基於業務的複雜,需要對不同的場景進行判斷,每當多出一種情況,那麼又要新增一條if/else,這樣讓**看起來非常的冗長以及修改起來很麻煩,剛才看到其中一種思路,應用到了設計模式中的策略模式。
設計模式有20多種包括:單例,介面卡、策略、工廠…這裡僅僅是其中一種,算是我自己對剛敲的案例的理解和總結吧。我算是萌新吧,如果覺得囉嗦請諒解一下~
乙個聊天平台,由於雙方傳送的訊息的內容不同所以有不用的處理方式,覺得原來的if/else太過於繁瑣且耦合度高,不易擴充套件,就算換成switch匹配的話後期新增新的型別也會很麻煩,所以想要用策略模式優化。
原場景
if
(msgtype =
"文字"
)else
if(msgtype ="")
else
if(msgtype =
)else
訊息物件
@data
// lombok外掛程式 自動生成set/get方法以及equals等 可以簡化開發 挺好用的
@allargsconstructor
public
class
messageinfo
訊息型別列舉類
public
enum msg_type
}
訊息處理類
基礎介面:
public
inte***ce
messageservice
實現類:簡單就例舉兩種訊息型別
:
@msgtypehandler
(msg_type.image)
@service
public
class
imgmsgserviceimpl
implements
messageservice
}
文字:
@msgtypehandler
(msg_type.text)
@service
public
class
textmsgserviceimpl
implements
messageservice
}
可以看到服務類上有個註解 @msgtypehandler(msg_type.text),這是乙個自定義註解表示該類具體處理哪種型別的訊息
自定義註解
/**
* 註解意義分別為 該註解可用於標註型別 編譯參與階段選擇 繼承
*/@documented
@target
(value = elementtype.type)
@retention
(retentionpolicy.runtime)
@inherited
public @inte***ce
msgtypehandler
為什麼要定義這個註解呢,當程式啟動開始初始化時,將所有對應的處理類存入容器中,然後通過訊息的型別取出容器中對應的service類,直接處理即可完成功能。提到容器和對應, 那肯定是需要乙個容器和相應的map才能完成想要的效果了。上**
容器
@component
public
class
messageservicecontext
public
void
putmessageservice
(integer code, messageservice messageservice)
}
初始化策略
@component
public
class
messageservicelistener
implements
);}
}
這樣就完成了,當程式啟動,所有註解了對應訊息型別的msghandler的service一開始就會被裝入容器中,然後具體呼叫業務時就是這樣的。
測試
@runwith
(springrunner.
class
)@springboottest
public
class
msgservicetest
}
if else 優化之 策略模式
在策略模式 strategy pattern 中,乙個類的行為或其演算法可以在執行時更改。這種型別的設計模式屬於行為型模式。在策略模式中,我們建立表示各種策略的物件和乙個行為隨著策略物件改變而改變的 context 物件。策略物件改變 context 物件的執行演算法。業務處理主服務類 servic...
策略模式 工廠模式優化if else
2.優化if else 思路描述 構建支付型別業務處理介面,不同的支付型別實現該介面並重寫介面方法實現支付型別的具體處理邏輯 構建支付型別工廠,根據對應支付型別獲取支付型別業務處理介面實現類.2.1構建支付型別介面 public inte ce paytypehandleservice2.2 根據不...
策略模式優化大量if else
在 編寫的個過程中難免會碰到使用到if else的情況,太多的if else會使 變的臃腫並且難以理解,然後想到了之前寫策略模式是可以對它進行優化的,的規範和易懂性我認為對乙個優秀程式設計師來說是必要的。平常經常碰到的 author cjd description 使用if.else臃腫的 retu...