天天看點

軟體設計原則 —— 開閉原則

開閉原則(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);
    }
}
           

開閉原則隻是一種原則,可以有很多種實作滿足這種原則,代碼的實作需要結合具體的場景。