欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設計模式之橋接模式詳解

 更新時間:2023年07月03日 10:25:21   作者:程序員皮卡秋  
橋接模式(Bridge Pattern)是一種結構型設計模式,用于將抽象部分和實現(xiàn)部分`分離開來,從而使它們可以獨立地進行變化,本節(jié)給大家講一下設計模式中的橋接模式,并結合實際業(yè)務場景給大家講解如何使用,需要的朋友可以參考下

橋接模式

橋接模式(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 橋接模式的資料請關注腳本之家其它相關文章!

相關文章

  • mybatisplus駝峰命名映射的問題解決

    mybatisplus駝峰命名映射的問題解決

    本文主要介紹了mybatisplus駝峰命名映射的問題解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 簡單了解spring bean作用域屬性singleton和prototype的區(qū)別

    簡單了解spring bean作用域屬性singleton和prototype的區(qū)別

    這篇文章主要介紹了簡單了解spring bean作用域屬性singleton和prototype的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • springboot讀取resource配置文件生成容器對象的示例代碼

    springboot讀取resource配置文件生成容器對象的示例代碼

    這篇文章主要介紹了springboot讀取resource配置文件生成容器對象的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • java中通用的線程池實例代碼

    java中通用的線程池實例代碼

    java中通用的線程池實例代碼,需要的朋友可以參考一下
    2013-03-03
  • 詳解SpringBoot如何使用JWT實現(xiàn)身份認證和授權

    詳解SpringBoot如何使用JWT實現(xiàn)身份認證和授權

    JSON?Web?Token(JWT)是一種用于在網絡應用之間安全傳遞信息的開放標準,本文主要為大家介紹了如何在Spring?Boot中使用JWT實現(xiàn)身份認證和授權,需要的可以了解下
    2023-10-10
  • 使用svn管理Maven項目的方法步驟

    使用svn管理Maven項目的方法步驟

    這篇文章主要介紹了使用svn管理Maven項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java如何把map分割成多個map

    Java如何把map分割成多個map

    這篇文章主要介紹了Java如何把map分割成多個map,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08
  • Java調用構造函數和方法及使用詳解

    Java調用構造函數和方法及使用詳解

    在Java編程中,構造函數用于初始化新創(chuàng)建的對象,而方法則用于執(zhí)行對象的行為,構造函數在使用new關鍵字創(chuàng)建類實例時自動調用,沒有返回類型,并且名稱與類名相同,本文通過示例詳細介紹了如何在Java中使用構造函數和方法,感興趣的朋友一起看看吧
    2024-10-10
  • springcloud feign傳輸List的坑及解決

    springcloud feign傳輸List的坑及解決

    這篇文章主要介紹了springcloud feign傳輸List的坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java將Word轉換成PDF的常用用法

    Java將Word轉換成PDF的常用用法

    Java開發(fā)人員在處理文檔轉換時,常常需要將Word或Excel文檔轉換為PDF格式,以便于更好地保持格式一致性、便于分發(fā)和打印,這篇文章主要給大家介紹了關于Java將Word轉換成PDF的常用用法,需要的朋友可以參考下
    2024-08-08

最新評論