使用橋接模式設計複雜的訊息系統

語言: CN / TW / HK

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

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

file

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

```java

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

```

建立郵件訊息實現EmailMessage類。

```java

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

```

建立簡訊訊息實現SmsMessage類。

```java

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

```

然後建立橋接抽象角色AbstractMessage類。

```java

/* * 抽象訊息類 / 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類。

```java

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

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

@Override
public void sendMessage(String message, String toUser) {
    //對於普通訊息,直接呼叫父類方法傳送訊息即可
    super.sendMessage(message, toUser);
}

}

```

建立具體實現加急訊息UrgencyMessage類。

```java

/* * 加急訊息類 / 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;
}

}

```

最後編寫客戶端測試程式碼。

```java

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彈架構 』可獲取更多技術乾貨!