最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java設(shè)計(jì)模式之橋接模式詳解

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

橋接模式

橋接模式(Bridge Pattern)``是一種結(jié)構(gòu)型設(shè)計(jì)模式,用于將抽象部分實(shí)現(xiàn)部分`分離開(kāi)來(lái),從而使它們可以獨(dú)立地進(jìn)行變化。這種模式通過(guò)將抽象部分與實(shí)現(xiàn)部分解耦,使得它們可以獨(dú)立地進(jìn)行擴(kuò)展、修改和重用。

在橋接模式中,抽象部分和實(shí)現(xiàn)部分分別由兩個(gè)層次結(jié)構(gòu)來(lái)實(shí)現(xiàn)。抽象部分定義了對(duì)外提供的接口和方法,而實(shí)現(xiàn)部分則提供了具體的實(shí)現(xiàn)細(xì)節(jié)。通過(guò)將抽象部分和實(shí)現(xiàn)部分解耦,我們可以在不影響系統(tǒng)穩(wěn)定性的前提下對(duì)其進(jìn)行修改和擴(kuò)展。

舉個(gè)例子,假設(shè)我們正在開(kāi)發(fā)一個(gè)跨平臺(tái)的音樂(lè)播放器,它可以在 Windows、Mac、Linux 等多種操作系統(tǒng)上運(yùn)行。由于不同的操作系統(tǒng)之間存在很大的差異,因此我們需要針對(duì)每種操作系統(tǒng)編寫(xiě)不同的實(shí)現(xiàn)代碼。在這種情況下,我們可以使用橋接模式來(lái)將抽象部分和實(shí)現(xiàn)部分分離開(kāi)來(lái)。

首先,我們定義一個(gè)抽象類(lèi) MediaPlayer,它定義了播放器的基本接口和方法:

public abstract class MediaPlayer {
    protected OperatingSystem operatingSystem;
    public MediaPlayer(OperatingSystem operatingSystem) {
        this.operatingSystem = operatingSystem;
    }
    public abstract void play();
}

其中,OperatingSystem 是一個(gè)抽象類(lèi),定義了不同操作系統(tǒng)之間的共同特征:

public abstract class OperatingSystem {
    public abstract String getName();
}

接下來(lái),我們定義不同操作系統(tǒng)的具體實(shí)現(xiàn)類(lèi),例如 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)下的具體播放器實(shí)現(xiàn)類(lèi),例如 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平臺(tái)下可以這么調(diào)用

public class BridgeTest {
    public static void main(String[] args) {
        MediaPlayer player = new MacMediaPlayer(new Mac());
        player.play();
        // Playing on Mac using MacMediaPlayer.
    }
}

橋接模式的優(yōu)點(diǎn)有:

  • 提高可擴(kuò)展性:橋接模式將抽象部分與實(shí)現(xiàn)部分分離,使它們可以分別變化。這樣,當(dāng)增加一個(gè)新的實(shí)現(xiàn)時(shí),就不需要修改抽象部分和其他實(shí)現(xiàn)部分了,只需要添加一個(gè)新的實(shí)現(xiàn)即可。

  • 降低耦合度:橋接模式將抽象部分與實(shí)現(xiàn)部分分離,使它們可以獨(dú)立變化,從而降低了它們之間的耦合度。這使得系統(tǒng)更易于維護(hù)和擴(kuò)展。

  • 更好的分離抽象與實(shí)現(xiàn):橋接模式提供了一個(gè)更好的分離抽象與實(shí)現(xiàn)的方式,使得抽象與實(shí)現(xiàn)可以獨(dú)立變化。這使得系統(tǒng)更具靈活性、可擴(kuò)展性和可維護(hù)性。

是不是比你if/else好太多~

最佳實(shí)踐

假設(shè)我們正在開(kāi)發(fā)一個(gè)電商平臺(tái),以下是訂單處理的橋接模式的實(shí)現(xiàn):

首先,定義一個(gè)抽象類(lèi) Order,它有一個(gè)抽象方法 process()

public abstract class Order {
    protected OrderProcessor orderProcessor;
    public Order(OrderProcessor orderProcessor) {
        this.orderProcessor = orderProcessor;
    }
    public abstract void process();
}

然后,定義兩個(gè)具體的訂單類(lèi) 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();
    }
}

接下來(lái),定義一個(gè)抽象類(lèi) OrderProcessor,它有兩個(gè)抽象方法 processNormalOrder() 和 processRushOrder()

public abstract class OrderProcessor {
    public abstract void processNormalOrder();
    public abstract void processRushOrder();
}

然后,定義兩個(gè)具體的訂單處理類(lèi) 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("線下訂單處理加急訂單");
    }
}

最后,在客戶(hù)端中,可以根據(jù)需要?jiǎng)?chuàng)建不同的訂單對(duì)象和訂單處理對(duì)象,并將它們橋接起來(lái):

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();
    }
}

輸出:

在線訂單處理普通訂單
在線訂單處理加急訂單
線下訂單處理普通訂單
線下訂單處理加急訂單

結(jié)束語(yǔ)

設(shè)計(jì)模式其實(shí)并不難,大家在學(xué)習(xí)的時(shí)候一定要在理解的基礎(chǔ)上去寫(xiě)代碼,不要去背代碼。

以上就是Java設(shè)計(jì)模式之橋接模式代碼示例的詳細(xì)內(nèi)容,更多關(guān)于Java 橋接模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Spring Boot最核心的27個(gè)注解,你了解多少?

    詳解Spring Boot最核心的27個(gè)注解,你了解多少?

    這篇文章主要介紹了詳解Spring Boot最核心的27個(gè)注解,你了解多少?文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解

    IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解

    這篇文章主要介紹了IDEA調(diào)試小技巧之Evaluate調(diào)試工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • spring?boot+mybatis-plus配置讀寫(xiě)分離的操作

    spring?boot+mybatis-plus配置讀寫(xiě)分離的操作

    這篇文章主要介紹了spring?boot+mybatis-plus配置讀寫(xiě)分離的操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • 一文詳解如何查看jdk版本及安裝路徑

    一文詳解如何查看jdk版本及安裝路徑

    這篇文章主要給大家介紹了關(guān)于如何查看jdk版本及安裝路徑的相關(guān)資料,JDK是Java語(yǔ)言的軟件開(kāi)發(fā)工具包,主要用于移動(dòng)設(shè)備、嵌入式設(shè)備上的java應(yīng)用程序,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10
  • JavaFX實(shí)現(xiàn)拖拽結(jié)點(diǎn)效果

    JavaFX實(shí)現(xiàn)拖拽結(jié)點(diǎn)效果

    這篇文章主要為大家詳細(xì)介紹了JavaFX實(shí)現(xiàn)拖拽結(jié)點(diǎn)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析

    SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析

    這篇文章主要介紹了SpringBoot redis分布式緩存實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 關(guān)于Java的Character類(lèi)詳解

    關(guān)于Java的Character類(lèi)詳解

    這篇文章主要介紹了關(guān)于Java的Character類(lèi)詳解,Java中的Character類(lèi)是一個(gè)包裝類(lèi),用于封裝一個(gè)基本數(shù)據(jù)類(lèi)型char的值,它提供了一些靜態(tài)方法來(lái)操作字符,需要的朋友可以參考下
    2023-05-05
  • 詳解java線程的開(kāi)始、暫停、繼續(xù)

    詳解java線程的開(kāi)始、暫停、繼續(xù)

    本文將介紹通過(guò)線程讀取文件內(nèi)容,并且可以控制線程的開(kāi)始、暫停、繼續(xù),來(lái)控制讀文件。具有一定的參考作用,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • 一文詳解MQ消息丟失問(wèn)題的5種解決方案

    一文詳解MQ消息丟失問(wèn)題的5種解決方案

    有些小伙伴在工作中,一提到消息隊(duì)列就覺(jué)得很簡(jiǎn)單,但真正遇到線上消息丟失時(shí),排查起來(lái)卻讓人抓狂,今天這篇文章,專(zhuān)門(mén)跟大家一起聊聊這個(gè)話題,希望對(duì)你會(huì)有所幫助
    2025-10-10
  • springboot接入mq的方法示例

    springboot接入mq的方法示例

    本文主要介紹了springboot接入mq的方法示例,主要實(shí)現(xiàn)配置以及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的發(fā)送、接收消息的例子,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

化德县| 巍山| 惠州市| 天门市| 西乡县| 井陉县| 休宁县| 平邑县| 新蔡县| 毕节市| 镇安县| 措美县| 湟源县| 合阳县| 昂仁县| 大同市| 大兴区| 米脂县| 昭觉县| 民权县| 大丰市| 巴马| 乌鲁木齐市| 博客| 毕节市| 蕲春县| 苏尼特右旗| 运城市| 金沙县| 通化市| 罗平县| 平潭县| 荃湾区| 樟树市| 宁海县| 延边| 胶南市| 南汇区| 定日县| 依安县| 灵山县|