使用橋接模式設計復雜的消息系統


本文節選自《設計模式就該這樣學》

舉個例子,我們在平時辦公的時候經常通過郵件消息、短信消息或者系統內消息與同事進行溝通。尤其在走一些審批流程的時候,我們需要記錄這些過程以備查。根據類型來划分,消息可以分為郵件消息、短信消息和系統內消息。但是,根據緊急程度來划分,消息可以分為普通消息、加急消息和特急消息。顯然,整個消息系統可以划分為兩個維度,如下圖所示。

file

如果我們用繼承,則情況就復雜了,而且也不利於擴展。郵件消息可以是普通的,也可以是加急的;短信消息可以是普通的,也可以是加急的。下面我們用橋接模式來解決這個問題。
首先創建一個IMessage接口擔任橋接的角色。


/**
 * 實現消息發送的統一接口
 */
public interface IMessage {
    //要發送的消息的內容和接收人
    void send(String message, String toUser);
}

創建郵件消息實現EmailMessage類。


/**
 * 郵件消息的實現類
 */
public class EmailMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用郵件消息發送" + message + "給" + toUser);
    }
}

創建短信消息實現SmsMessage類。


/**
 * 短信消息的實現類
 * SMS(Short IMessage Service)短信消息服務
 */
public class SmsMessage implements IMessage {
    public void send(String message, String toUser) {
        System.out.println("使用短信消息發送" + message + "給" + toUser);
    }
}

然后創建橋接抽象角色AbstractMessage類。


/**
 * 抽象消息類
 */
public abstract class AbstractMessage {
    //持有一個實現部分的對象
    IMessage message;

    //構造方法,傳入實現部分的對象
    public AbstractMessage(IMessage message) {
        this.message = message;
    }

    //發送消息,委派給實現部分的方法
    public void sendMessage(String message, String toUser) {
        this.message.send(message, toUser);
    }
}

創建具體實現普通消息NomalMessage類。


/**
 * 普通消息類
 */
public class NomalMessage extends AbstractMessage {

    //構造方法,傳入實現部分的對象
    public NomalMessage(IMessage message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        //對於普通消息,直接調用父類方法發送消息即可
        super.sendMessage(message, toUser);
    }
}

創建具體實現加急消息UrgencyMessage類。


/**
 * 加急消息類
 */
public class UrgencyMessage extends AbstractMessage {

    //構造方法
    public UrgencyMessage(IMessage message) {
        super(message);
    }

    @Override
    public void sendMessage(String message, String toUser) {
        message = "加急:" + message;
        super.sendMessage(message, toUser);
    }

    //擴展它功能,監控某個消息的處理狀態
    public Object watch(String messageId) {
        //根據給出的消息編碼(messageId)查詢消息的處理狀態
        //組織成監控的處理狀態,然后返回
        return null;
    }
}

最后編寫客戶端測試代碼。


 public static void main(String[] args) {
        IMessage message = new SmsMessage();
        AbstractMessage abstractMessage = new NomalMessage(message);
        abstractMessage.sendMessage("加班申請速批", "王總");

        message = new EmailMessage();
        abstractMessage = new UrgencyMessage(message);
        abstractMessage.sendMessage("加班申請速批", "王總");
}

運行結果如下圖所示。

file

在上面的案例中,我們采用橋接模式解耦了“消息類型”和“消息緊急程度”這兩個獨立變化的維度。后續如果有更多的消息類型,比如微信、釘釘等,則直接新建一個類繼承IMessage即可;如果緊急程度需要新增,則同樣只需新建一個類實現AbstractMessage類即可。

關注微信公眾號『 Tom彈架構 』回復“設計模式”可獲取完整源碼。

【推薦】Tom彈架構:30個設計模式真實案例(附源碼),挑戰年薪60W不是夢

本文為“Tom彈架構”原創,轉載請注明出處。技術在於分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力。關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM