開閉原則(Open-Closed Principle)是指一個軟體實體(類,子產品和函數)應該對擴充開放,對修改關閉。它是針對擴充和修改兩個行為的原則。它強調用抽象建構架構,用實作擴充細節,用以提高系統的可複用性和可維護性,該原則是讓在增加新功能的同時盡量不修改已有代碼。
幾乎任何一款優秀的架構都使用了開閉原則,比如Spring,我們使用Spring的時候不需要修改Spring源代碼,就可以內建很多其他架構,增加功能。這裡我們使用項目中的微信公衆号的消息接收為案例,我們在開發微信公衆号時,可以接收微信伺服器發來的多種消息:text,image,voice,event等類型的消息,如果一股腦的代碼就是一個類處理所有的消息:
public void msgHandler(Wechatmsg wechatMsg) {
String msgType = wechatMsg.getMsgType();
switch(msgType) {
case "text":
break;
case :"voice"
break;
default:
}
}
上面我們處理了微信的兩種消息,如果有新需求需要處理圖檔消息,視訊消息等,隻能在源代碼中接着加case語句,這肯定是違背了開閉原則。開閉原則強調用抽象建構架構,用實作擴充細節,是以我們可以建立微信消息處理接口:
public interface WeChatMsgHandler {
//定義消息類型處理器名稱
String getName();
//處理微信消息
void msgHandler(WechatMsg weChatMsg);
}
如果我們想要處理文本消息,則隻需要實作該接口即可,如果想要處理其他類型的消息,也隻需要實作WeChatMsgHandler接口,完美的實作了開閉原則。
public class WeChatTextMsgHandler implements WeChatMsgHandler {
@Override
public String getName() {
return "text";
}
@Override
public void msgHandler(WechatMsg weChatMsg) {
//處理文本消息
}
}
而前面的複雜的switch case語句則就可以改成如下形式,這樣子無論是添加新的消息處理器,還是修改其中的一個消息處理器都不會影響到其他的消息處理。
public void msgHandler(Wechatmsg wechatMsg) {
String msgType = wechatMsg.getMsgType();
//map存儲的為WeChatMsgHandler執行個體,key為WeChatMsgHandler的getName();
WeChatMsgHandler wechatMsgHandler = map.get(msgType);
wechatMsgHandler.msgHandler(weChatMsg);
}
}
開閉原則隻是一種原則,可以有很多種實作滿足這種原則,代碼的實作需要結合具體的場景。