if
(msgtype =
"文字"
)else
if(msgtype ="")
else
if(msgtype =
)else
就是根據訊息的不同型別有不同的處理策略,每種訊息的處理策略**都很長,如果都放在這種if else**快中,**很難維護也很醜,所以我們一開始就用了策略模式來處理這種情況。
策略模式還挺簡單的,就是定義乙個介面,然後有多個實現類,每種實現類封裝了一種行為。然後根據條件的不同選擇不同的實現類。
訊息物件,當然真實的物件沒有這麼簡單,省略了很多屬性
@data
@allargsconstructor
public
class
messageinfo
定義乙個訊息處理介面
public
inte***ce
messageservice
有2個訊息處理介面,分別處理不同的訊息
處理文字訊息
@service
@msgtypehandler
(value = msg_type.text)
public
class
textmessageservice
implements
messageservice
}
處理訊息
@service
@msgtypehandler
(value = msg_type.image)
public
class
imagemessageservice
implements
messageservice
}
文章寫到這,可能大多數人可能會想到要需要如下乙個map, map《訊息型別,訊息處理物件》,這樣直接根據訊息型別就能拿到訊息處理物件,呼叫訊息處理物件的方法即可。我們就是這樣做的,但是我們不想手動維護這個map物件,因為每次增加新的訊息處理類,map的初始化過程就得修改
定義乙個訊息型別的列舉類
public
enum msg_type
}
定義乙個註解
@documented
@inherited
@target
(elementtype.type)
@retention
(retentionpolicy.runtime)
public @inte***ce
msgtypehandler
不知道你注意到了沒,前面的**中,每種訊息處理類上面都有乙個@msgtypehandler註解,表明了這個處理類
處理哪種型別的訊息
@service
@msgtypehandler
(value = msg_type.text)
public
class
textmessageservice
implements
messageservice
}
用乙個context物件儲存了訊息型別->訊息處理物件的對映關係
@component
public
class
messageservicecontext
public
void
putmessageservice
(integer code, messageservice messageservice)
}
最精彩的部分到了
@component
public
class
messageservicelistener
implements
);}}
在spring的啟動過程中,通過解析註解,將訊息型別->訊息處理物件的對映關係儲存到messageservicecontext物件中
@autowired
messageservicecontext messageservicecontext;
@test
public
void
contextloads()
測試類正常工作,通過策略模式避免了寫大量的if else**,也更容易維護
專案中的if else太多了,該怎麼重構?
策略模式還挺簡單的,就是定義乙個介面,然後有多個實現類,每種實現類封裝了一種行為。然後根據條件的不同選擇不同的實現類。實現過程 訊息物件,當然真實的物件沒有這麼簡單,省略了很多屬性 data allargsconstructor public class messageinfo 12 3456 78...
專案中的if else太多了,該怎麼重構?
if msgtype 文字 else if msgtype else 就是根據訊息的不同型別有不同的處理策略,每種訊息的處理策略 都很長,如果都放在這種if else 快中,很難維護也很醜,所以我們一開始就用了策略模式來處理這種情況。策略模式還挺簡單的,就是定義乙個介面,然後有多個實現類,每種實現類...
專案中的if else太多了,該怎麼重構?
if msgtype 文字 else if msgtype else就是根據訊息的不同型別有不同的處理策略,每種訊息的處理策略 都很長,如果都放在這種if else 快中,很難維護也很醜,所以我們一開始就用了策略模式來處理這種情況。策略模式還挺簡單的,就是定義乙個介面,然後有多個實現類,每種實現類封...