本文節選自《設計模式就該這樣學》
舉個例子,我們在平時辦公的時候經常通過郵件訊息、短信訊息或者系統內訊息與同事進行溝通,尤其在走一些審批流程的時候,我們需要記錄這些程序以備查,根據型別來劃分,訊息可以分為郵件訊息、短信訊息和系統內訊息,但是,根據緊急程度來劃分,訊息可以分為普通訊息、加急訊息和特急訊息,顯然,整個訊息系統可以劃分為兩個維度,如下圖所示,

如果我們用繼承,則情況就復雜了,而且也不利于擴展,郵件訊息可以是普通的,也可以是加急的;短信訊息可以是普通的,也可以是加急的,下面我們用橋接模式來解決這個問題,
首先創建一個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("加班申請速批", "王總");
}
運行結果如下圖所示,

在上面的案例中,我們采用橋接模式解耦了“訊息型別”和“訊息緊急程度”這兩個獨立變化的維度,后續如果有更多的訊息型別,比如微信、釘釘等,則直接新建一個類繼承IMessage即可;如果緊急程度需要新增,則同樣只需新建一個類實作AbstractMessage類即可,
【推薦】Tom彈架構:收藏本文,相當于收藏一本“設計模式”的書
本文為“Tom彈架構”原創,轉載請注明出處,技術在于分享,我分享我快樂!
如果本文對您有幫助,歡迎關注和點贊;如果您有任何建議也可留言評論或私信,您的支持是我堅持創作的動力,關注微信公眾號『 Tom彈架構 』可獲取更多技術干貨!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/353116.html
標籤:Java
上一篇:面向物件
