Java設(shè)計(jì)模式之橋接模式詳解
橋接模式
橋接模式(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è)抽象類 MediaPlayer,它定義了播放器的基本接口和方法:
public abstract class MediaPlayer {
protected OperatingSystem operatingSystem;
public MediaPlayer(OperatingSystem operatingSystem) {
this.operatingSystem = operatingSystem;
}
public abstract void play();
}其中,OperatingSystem 是一個(gè)抽象類,定義了不同操作系統(tǒng)之間的共同特征:
public abstract class OperatingSystem {
public abstract String getName();
}接下來(lái),我們定義不同操作系統(tǒng)的具體實(shí)現(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)下的具體播放器實(shí)現(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平臺(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è)抽象類 Order,它有一個(gè)抽象方法 process():
public abstract class Order {
protected OrderProcessor orderProcessor;
public Order(OrderProcessor orderProcessor) {
this.orderProcessor = orderProcessor;
}
public abstract void process();
}然后,定義兩個(gè)具體的訂單類 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è)抽象類 OrderProcessor,它有兩個(gè)抽象方法 processNormalOrder() 和 processRushOrder():
public abstract class OrderProcessor {
public abstract void processNormalOrder();
public abstract void processRushOrder();
}然后,定義兩個(gè)具體的訂單處理類 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("線下訂單處理加急訂單");
}
}最后,在客戶端中,可以根據(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)文章
簡(jiǎn)單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別
這篇文章主要介紹了簡(jiǎn)單了解spring bean作用域?qū)傩詓ingleton和prototype的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
springboot讀取resource配置文件生成容器對(duì)象的示例代碼
這篇文章主要介紹了springboot讀取resource配置文件生成容器對(duì)象的示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
詳解SpringBoot如何使用JWT實(shí)現(xiàn)身份認(rèn)證和授權(quán)
JSON?Web?Token(JWT)是一種用于在網(wǎng)絡(luò)應(yīng)用之間安全傳遞信息的開(kāi)放標(biāo)準(zhǔn),本文主要為大家介紹了如何在Spring?Boot中使用JWT實(shí)現(xiàn)身份認(rèn)證和授權(quán),需要的可以了解下2023-10-10
Java調(diào)用構(gòu)造函數(shù)和方法及使用詳解
在Java編程中,構(gòu)造函數(shù)用于初始化新創(chuàng)建的對(duì)象,而方法則用于執(zhí)行對(duì)象的行為,構(gòu)造函數(shù)在使用new關(guān)鍵字創(chuàng)建類實(shí)例時(shí)自動(dòng)調(diào)用,沒(méi)有返回類型,并且名稱與類名相同,本文通過(guò)示例詳細(xì)介紹了如何在Java中使用構(gòu)造函數(shù)和方法,感興趣的朋友一起看看吧2024-10-10

