Java設計模式之橋接模式詳解
橋接模式
橋接模式(Bridge Pattern)``是一種結構型設計模式,用于將
抽象部分和
實現(xiàn)部分`分離開來,從而使它們可以獨立地進行變化。這種模式通過將抽象部分與實現(xiàn)部分解耦,使得它們可以獨立地進行擴展、修改和重用。
在橋接模式中,抽象部分和實現(xiàn)部分分別由兩個層次結構來實現(xiàn)。抽象部分定義了對外提供的接口和方法,而實現(xiàn)部分則提供了具體的實現(xiàn)細節(jié)。通過將抽象部分和實現(xiàn)部分解耦,我們可以在不影響系統(tǒng)穩(wěn)定性的前提下對其進行修改和擴展。
舉個例子,假設我們正在開發(fā)一個跨平臺的音樂播放器,它可以在 Windows、Mac、Linux 等多種操作系統(tǒng)上運行。由于不同的操作系統(tǒng)之間存在很大的差異,因此我們需要針對每種操作系統(tǒng)編寫不同的實現(xiàn)代碼。在這種情況下,我們可以使用橋接模式來將抽象部分和實現(xiàn)部分分離開來。
首先,我們定義一個抽象類 MediaPlayer
,它定義了播放器的基本接口和方法:
public abstract class MediaPlayer { protected OperatingSystem operatingSystem; public MediaPlayer(OperatingSystem operatingSystem) { this.operatingSystem = operatingSystem; } public abstract void play(); }
其中,OperatingSystem
是一個抽象類,定義了不同操作系統(tǒng)之間的共同特征:
public abstract class OperatingSystem { public abstract String getName(); }
接下來,我們定義不同操作系統(tǒng)的具體實現(xiàn)類,例如 Windows、Mac 和 Linux
:
public class Windows extends OperatingSystem { @Override public String getName() { return "Windows"; } } public class Mac extends OperatingSystem { @Override public String getName() { return "Mac"; } } public class Linux extends OperatingSystem { @Override public String getName() { return "Linux"; } }
最后,我們定義不同操作系統(tǒng)下的具體播放器實現(xiàn)類,例如 WindowsMediaPlayer、MacMediaPlayer 和 LinuxMediaPlayer
:
public class WindowsMediaPlayer extends MediaPlayer { public WindowsMediaPlayer(OperatingSystem operatingSystem) { super(operatingSystem); } @Override public void play() { System.out.println("Playing on " + operatingSystem.getName() + " using WindowsMediaPlayer."); } } public class MacMediaPlayer extends MediaPlayer { public MacMediaPlayer(OperatingSystem operatingSystem) { super(operatingSystem); } @Override public void play() { System.out.println("Playing on " + operatingSystem.getName() + " using MacMediaPlayer."); } } public class LinuxMediaPlayer extends MediaPlayer { public LinuxMediaPlayer(OperatingSystem operatingSystem) { super(operatingSystem); } @Override public void play() { System.out.println("Playing on " + operatingSystem.getName() + " using LinuxMediaPlayer."); } }
比如在mac
平臺下可以這么調用
public class BridgeTest { public static void main(String[] args) { MediaPlayer player = new MacMediaPlayer(new Mac()); player.play(); // Playing on Mac using MacMediaPlayer. } }
橋接模式的優(yōu)點有:
提高可擴展性:橋接模式將抽象部分與實現(xiàn)部分分離,使它們可以分別變化。這樣,當增加一個新的實現(xiàn)時,就不需要修改抽象部分和其他實現(xiàn)部分了,只需要添加一個新的實現(xiàn)即可。
降低耦合度:橋接模式將抽象部分與實現(xiàn)部分分離,使它們可以獨立變化,從而降低了它們之間的耦合度。這使得系統(tǒng)更易于維護和擴展。
更好的分離抽象與實現(xiàn):橋接模式提供了一個更好的分離抽象與實現(xiàn)的方式,使得抽象與實現(xiàn)可以獨立變化。這使得系統(tǒng)更具靈活性、可擴展性和可維護性。
是不是比你if/else
好太多~
最佳實踐
假設我們正在開發(fā)一個電商平臺,以下是訂單處理的橋接模式的實現(xiàn):
首先,定義一個抽象類 Order
,它有一個抽象方法 process()
:
public abstract class Order { protected OrderProcessor orderProcessor; public Order(OrderProcessor orderProcessor) { this.orderProcessor = orderProcessor; } public abstract void process(); }
然后,定義兩個具體的訂單類 NormalOrder
和 RushOrder
,它們繼承自 Order
:
public class NormalOrder extends Order { public NormalOrder(OrderProcessor orderProcessor) { super(orderProcessor); } @Override public void process() { orderProcessor.processNormalOrder(); } } public class RushOrder extends Order { public RushOrder(OrderProcessor orderProcessor) { super(orderProcessor); } @Override public void process() { orderProcessor.processRushOrder(); } }
接下來,定義一個抽象類 OrderProcessor
,它有兩個抽象方法 processNormalOrder()
和 processRushOrder()
:
public abstract class OrderProcessor { public abstract void processNormalOrder(); public abstract void processRushOrder(); }
然后,定義兩個具體的訂單處理類 OnlineOrderProcessor
和 OfflineOrderProcessor
,它們繼承自 OrderProcessor
:
public class OnlineOrderProcessor extends OrderProcessor { @Override public void processNormalOrder() { System.out.println("在線訂單處理普通訂單"); } @Override public void processRushOrder() { System.out.println("在線訂單處理加急訂單"); } } public class OfflineOrderProcessor extends OrderProcessor { @Override public void processNormalOrder() { System.out.println("線下訂單處理普通訂單"); } @Override public void processRushOrder() { System.out.println("線下訂單處理加急訂單"); } }
最后,在客戶端中,可以根據需要創(chuàng)建不同的訂單對象和訂單處理對象,并將它們橋接起來:
public class BridgeTest { public static void main(String[] args) throws Exception { OrderProcessor onlineOrderProcessor = new OnlineOrderProcessor(); OrderProcessor offlineOrderProcessor = new OfflineOrderProcessor(); Order normalOnlineOrder = new NormalOrder(onlineOrderProcessor); Order rushOnlineOrder = new RushOrder(onlineOrderProcessor); Order normalOfflineOrder = new NormalOrder(offlineOrderProcessor); Order rushOfflineOrder = new RushOrder(offlineOrderProcessor); normalOnlineOrder.process(); rushOnlineOrder.process(); normalOfflineOrder.process(); rushOfflineOrder.process(); } }
輸出:
在線訂單處理普通訂單
在線訂單處理加急訂單
線下訂單處理普通訂單
線下訂單處理加急訂單
結束語
設計模式其實并不難,大家在學習的時候一定要在理解的基礎上去寫代碼,不要去背代碼。
以上就是Java設計模式之橋接模式代碼示例的詳細內容,更多關于Java 橋接模式的資料請關注腳本之家其它相關文章!
相關文章
簡單了解spring bean作用域屬性singleton和prototype的區(qū)別
這篇文章主要介紹了簡單了解spring bean作用域屬性singleton和prototype的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12springboot讀取resource配置文件生成容器對象的示例代碼
這篇文章主要介紹了springboot讀取resource配置文件生成容器對象的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07詳解SpringBoot如何使用JWT實現(xiàn)身份認證和授權
JSON?Web?Token(JWT)是一種用于在網絡應用之間安全傳遞信息的開放標準,本文主要為大家介紹了如何在Spring?Boot中使用JWT實現(xiàn)身份認證和授權,需要的可以了解下2023-10-10