<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 橋接設計模式 > 原文: [https://howtodoinjava.com/design-patterns/structural/bridge-design-pattern/](https://howtodoinjava.com/design-patterns/structural/bridge-design-pattern/) **橋接設計模式**用于將類分解為兩個部分(抽象及其實現),以便將來可以相互進化而不會相互影響。 它增加了類抽象與其實現之間的松散耦合。 ```java Table of Contents Design participants of bridge design pattern When we need bridge design pattern Sample problem statement Solution using bridge design pattern Final notes ``` > 將抽象與其實現分離,以便二者可以獨立變化。 橋是“手柄或身體”成語的同義詞。 這是一種將實現類封裝在接口類內部的設計機制。 前者是身體,后者是手柄。 用戶將手柄視為實際類,但工作是在體內完成的。 **通過在從抽象到實現的方法調用之間添加一個重定向,可以實現這種分離。** ## 橋接設計模式的設計參與者 ![Bridge pattern participants](https://img.kancloud.cn/ff/57/ff57d0214d1fe0379afd56ddf843bd34_800x400.png) 橋接模式參與者 以下參與者構成橋接設計模式。 1. #### `Abstraction`(抽象類) 它定義了抽象接口,即行為部分。 它還維護實現者參考。 2. #### `RefinedAbstraction`(普通類) 它擴展了`Abstraction`定義的接口。 3. #### `Implementer`(接口) 它定義了實現類的接口。 該接口不需要直接對應于抽象接口,并且可以有很大的不同。 抽象`imp`提供了一個由`Implementer`接口提供的操作的實現。 4. #### `ConcreteImplementor`(普通類) 它實現了`Implementer`接口。 ## 當我們需要橋接設計模式時 橋接模式是舊建議的應用,“**與繼承相比**更偏向組合”。 當您必須以彼此正交的方式將不同的時間子類化時,它將變得很方便。 例如,假設您要創建具有不同顏色的各種 GUI 形狀。 一種解決方案可能是: ![Without bridge pattern](https://img.kancloud.cn/34/44/34440d71e0a2454b7ee20068a657ed66_603x133.png) 不使用橋接模式 但是上述解決方案存在問題。 如果要更改`Rectange`類別,則可能最終也會更改`BlueRectangle`和`RedRectangle` – 即使更改是特定于顏色的,也可能需要更改`Circle`類別。 您可以通過以下方式解耦`Shape`和`Color`接口來解決上述問題。 ![With bridge pattern](https://img.kancloud.cn/e7/bb/e7bb81fedaeb1666a955a5c0ec3254f6_536x92.png) 使用橋接模式 現在,當您更改任何形狀時,顏色將保持不變。 同樣,反之亦然。 ## 問題陳述 > 網橋設計模式最適用于需要提供**平臺獨立性**的應用。 假設我們正在設計**應用,該應用可以在任何操作系統**上下載和存儲文件。 我想以這種方式設計系統,將來我應該能夠以最小的變化添加更多的平臺支持。 此外,如果我想在下載程序類中添加更多支持(例如,僅在 Windows 中刪除下載內容),那么它應該不會影響客戶端代碼以及 linux 下載程序。 ## 使用橋接設計模式的解決方案 由于此問題是與經典平臺獨立性相關的問題,因此我將使用橋接模式來解決此問題。 我將把下載器組件分為抽象部分和實現部分。 我在這里創建兩個接口,`FileDownloaderAbstraction`表示客戶端將與之交互的抽象; `FileDownloadImplementor`代表實現。 這樣,兩個層次結構可以獨立發展而不會互相影響。 **`FileDownloaderAbstraction.java`** ```java public interface FileDownloaderAbstraction { public Object download(String path); public boolean store(Object object); } ``` **`FileDownloaderAbstractionImpl.java`** ```java public class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction { private FileDownloadImplementor provider = null; public FileDownloaderAbstractionImpl(FileDownloadImplementor provider) { super(); this.provider = provider; } @Override public Object download(String path) { return provider.downloadFile(path); } @Override public boolean store(Object object) { return provider.storeFile(object); } } ``` **`FileDownloadImplementor.java`** ```java public interface FileDownloadImplementor { public Object downloadFile(String path); public boolean storeFile(Object object); } ``` **`LinuxFileDownloadImplementor.java`** ```java public class LinuxFileDownloadImplementor implements FileDownloadImplementor { @Override public Object downloadFile(String path) { return new Object(); } @Override public boolean storeFile(Object object) { System.out.println("File downloaded successfully in LINUX !!"); return true; } } ``` **`WindowsFileDownloadImplementor.java`** ```java public class WindowsFileDownloadImplementor implements FileDownloadImplementor { @Override public Object downloadFile(String path) { return new Object(); } @Override public boolean storeFile(Object object) { System.out.println("File downloaded successfully in WINDOWS !!"); return true; } } ``` **`Client.java`** ```java public class Client { public static void main(String[] args) { String os = "linux"; FileDownloaderAbstraction downloader = null; switch (os) { case "windows": downloader = new FileDownloaderAbstractionImpl( new WindowsFileDownloadImplementor() ); break; case "linux": downloader = new FileDownloaderAbstractionImpl( new LinuxFileDownloadImplementor() ); break; default: System.out.println("OS not supported !!"); } Object fileContent = downloader.download("some path"); downloader.store(fileContent); } } Output: File downloaded successfully in LINUX !! ``` #### 抽象的更改不會影響實現 現在,假設您要在抽象層添加另一項功能(即刪除)。 它也不能強迫現有的實現者和客戶進行改變。 **`FileDownloaderAbstraction.java`** ```java public interface FileDownloaderAbstraction { public Object download(String path); public boolean store(Object object); public boolean delete(String object); } ``` **`FileDownloaderAbstractionImpl.java`** ```java public class FileDownloaderAbstractionImpl implements FileDownloaderAbstraction { private FileDownloadImplementor provider = null; public FileDownloaderAbstractionImpl(FileDownloadImplementor provider) { super(); this.provider = provider; } @Override public Object download(String path) { return provider.downloadFile(path); } @Override public boolean store(Object object) { return provider.storeFile(object); } @Override public boolean delete(String object) { return false; } } ``` 上述更改并不強迫您對實現器類/接口進行任何更改。 #### 實現中的更改不會影響抽象 假設您要在實現層為客戶端不知道的所有下載程序添加刪除功能(內部功能)。 **`FileDownloadImplementor.java`** ```java public interface FileDownloadImplementor { public Object downloadFile(String path); public boolean storeFile(Object object); public boolean delete(String object); } ``` **`LinuxFileDownloadImplementor.java`** ```java public class LinuxFileDownloadImplementor implements FileDownloadImplementor { @Override public Object downloadFile(String path) { return new Object(); } @Override public boolean storeFile(Object object) { System.out.println("File downloaded successfully in LINUX !!"); return true; } @Override public boolean delete(String object) { return false; } } ``` **`WindowsFileDownloadImplementor.java`** ```java public class WindowsFileDownloadImplementor implements FileDownloadImplementor { @Override public Object downloadFile(String path) { return new Object(); } @Override public boolean storeFile(Object object) { System.out.println("File downloaded successfully in LINUX !!"); return true; } @Override public boolean delete(String object) { return false; } } ``` 上面的更改不會影響抽象層,因此客戶端完全不會受到影響。 ## 最后的筆記 1. 橋接模式將抽象與其實現分離,以便兩者可以獨立變化。 2. 它主要用于實現平臺獨立性功能。 3. 它添加了另一種方法級別重定向以實現該目標。 4. 將抽象接口發布在單獨的繼承層次結構中,并將實現放入其自己的繼承層次結構中。 5. 使用橋接模式來實現執行時的綁定。 6. 使用橋模式來映射正交類層次結構 7. 橋是預先設計的,以使抽象和實現獨立變化。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看