<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # Java 中的適配器設計模式 > 原文: [https://howtodoinjava.com/design-patterns/structural/adapter-design-pattern-in-java/](https://howtodoinjava.com/design-patterns/structural/adapter-design-pattern-in-java/) 曾經嘗試在筆記本電腦中使用*相機存儲卡*。 您不能直接使用它,因為筆記本電腦中沒有接受它的端口。 您必須使用兼容的讀卡器。 您將存儲卡放入讀卡器,然后將讀卡器注入筆記本電腦。 該讀卡器可以稱為適配器。 類似的示例是*移動充電器*或*筆記本電腦充電器*,它們可以與任何電源一起使用,而不必擔心不同位置的電源變化。 這也稱為電源“適配器”。 同樣在編程中,適配器模式也用于類似目的。 它使兩個不兼容的接口能夠彼此平滑地工作。 按照定義: 適配器設計模式是[**結構型設計模式**](// howtodoinjava.com/category/design-patterns/structural/)之一,它的使用是為了使兩個不相關的接口可以一起工作。 連接這些不相關接口的對象稱為適配器。 關于設計模式的 GOF 中提供的適配器的定義指出: > “將類的接口轉換為客戶期望的另一個接口。 適配器使類可以協同工作,因為接口不兼容,否則無法一起工作。” 適配器模式也稱為**包裝模式**。 當某些其他現有組件必須在不修改源代碼的情況下被現有系統采用時,適配器設計對于系統集成非常有用。 典型的交互是這樣的: ![adapter sequence diagram](https://img.kancloud.cn/92/cc/92cc3f7fba2e7929182e40613392acbe_500x278.png) ## 在哪里使用適配器設計模式? 這種模式的主要用途是當您需要使用的類不符合接口的要求時。 例如,如果要通過 java 中的命令提示符讀取系統輸入,則下面的代碼是執行此操作的常用方法: ```java BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Enter String"); String s = br.readLine(); System.out.print("Enter input: " + s); ``` 現在,請仔細觀察上面的代碼。 **1)`System.in`是`InputStream`的`static`實例,聲明為**: ```java public final static InputStream in = null; ``` 此輸入流以字節流的形式從控制臺本地讀取數據。 **2)如 Java 文檔所定義的 `BufferedReader`,讀取字符流。** ```java //Reads text from a character-input stream, buffering characters so as to //provide for the efficient reading of characters, arrays, and lines. public class BufferedReader extends Reader{..} ``` 現在這是問題所在。 `System.in`提供字節流,其中`BufferedReader`需要字符流。 他們將如何一起工作? 這是在兩個不兼容的接口之間放置適配器的**理想情況**。 `InputStreamReader`正是這樣做并且在`System.in`和`BufferedReader`之間工作適配器。 ```java /** An InputStreamReader is a bridge from byte streams to character streams: * It reads bytes and decodes them into characters using a specified charset. * The charset that it uses may be specified by name or may be given explicitly, * or the platform's default charset may be accepted. */ public class InputStreamReader extends Reader {...} ``` 我希望上述用例對大家都有意義。 現在,下一個問題是適配器應該做多少工作才能使兩個不兼容的接口一起工作? ## 適配器模式應該執行多少工作? 答案真的很簡單,它應該做很多工作,以便兩個不兼容的接口都能相互適應。 例如,在我們上面的案例研究中,一個`InputStreamReader`只是包裝了`InputStream`而沒有其他內容。 然后,`BufferedReader`能夠使用基礎的`Reader`讀取流中的字符。 ```java /** * Creates an InputStreamReader that uses the default charset. * @param in An InputStream */ public InputStreamReader(InputStream in) { super(in); try { sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object } catch (UnsupportedEncodingException e) { // The default encoding should always be available throw new Error(e); } } ``` 還要注意,如果目標服務器與被適配者相似,則適配器只需將來自目標的請求委托給被適配者。 如果目標和被適配者不相似,則適配器可能必須在它們之間轉換數據結構并實現目標所要求的但被適配者未實現的操作。 現在,當我們對適配器的外觀有了很好的了解后,讓我們確定適配器設計模式中使用的參與者: ## 適配器設計模式的參與者 下表列出了參與此模式的類和/或對象: * **`Target`**(`BufferedReader`):它定義客戶端直接使用的特定于應用的接口。 * **`Adapter`**(`InputStreamReader`):它將接口`Adaptee`適配到`Target`接口。 是中間人 * **`Adaptee`** (`System.in`):它定義了現有的不兼容接口,需要在應用中使用之前進行修改。 * **`Client`**:它是與`Target`接口一起使用的應用。 ## 適配器設計模式的其他示例實現 其他值得注意的例子如下: 1) [`java.util.Arrays#asList()`](https://docs.oracle.com/javase/6/docs/api/java/util/Arrays.html#asList%28T...%29 "Arrays.asList") 此方法接受多個字符串并返回輸入字符串的列表。 雖然這是非常基本的用法,但是它是適配器的功能,對不對? 2) [`java.io.OutputStreamWriter(OutputStream)`](https://docs.oracle.com/javase/6/docs/api/java/io/OutputStreamWriter.html#OutputStreamWriter%28java.io.OutputStream%29 "OutputStreamWriter") 這類似于我們在本文中討論的上述用例: ```java Writer writer = new OutputStreamWriter(new FileOutputStream("c:\\data\\output.txt")); writer.write("Hello World"); ``` 3) [`javax.xml.bind.annotation.adapters.XmlAdapter#marshal()`和`#unmarshal()`](https://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation/adapters/XmlAdapter.html "XmlAdapter") 使 Java 類型適應自定義編組處理。 將綁定類型轉換為值類型。 這就是這個簡單主題的全部內容。 學習愉快!
                  <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>

                              哎呀哎呀视频在线观看