設計模式——適配器模式

1. 概述

  將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。函數

2. 解決的問題

即Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。測試

1、下面是兩個很是形象的例子

輸入圖片說明

輸入圖片說明

3. 模式中的角色

  • 一 目標接口(Target):客戶所期待的接口。目標能夠是具體的或抽象的類,也能夠是接口。this

  • 二 須要適配的類(Adaptee):須要適配的類或適配者類。code

  • 三 適配器(Adapter):經過包裝一個須要適配的對象,把原接口轉換成目標接口。   對象

4. 實現方式

  • 1、類的適配器模式(採用繼承實現)繼承

  • 2、對象適配器(採用對象組合方式實現)接口

5. 適配器模式的類圖

輸入圖片說明

6. 類的適配器模式

// 已存在的、具備特殊功能、但不符合咱們既有的標準接口的類  
    class Adaptee {  
        public void specificRequest() {  
            System.out.println("被適配類具備 特殊功能...");  
        }  
    }  
      
    // 目標接口,或稱爲標準接口  
    interface Target {  
        public void request();  
    }  
      
    // 具體目標類,只提供普通功能  
    class ConcreteTarget implements Target {  
        public void request() {  
            System.out.println("普通類 具備 普通功能...");  
        }  
    }  
       
    // 適配器類,繼承了被適配類,同時實現標準接口  
    class Adapter extends Adaptee implements Target{  
        public void request() {  
            super.specificRequest();  
        }  
    }  
       
    // 測試類public class Client {  
        public static void main(String[] args) {  
            // 使用普通功能類  
            Target concreteTarget = new ConcreteTarget();  
            concreteTarget.request();  
              
            // 使用特殊功能類,即適配類  
            Target adapter = new Adapter();  
            adapter.request();  
        }  
    }

一、測試結果:

普通類 具備 普通功能...  
    被適配類具備 特殊功能...

7. 對象適配器模式

1、狀況描述

上面這種實現的適配器稱爲類適配器,由於 Adapter 類既繼承了 Adaptee (被適配類),也實現了 Target 接口(由於 Java 不支持多繼承,因此這樣來實現),在 Client 類中咱們能夠根據須要選擇並建立任一種符合需求的子類,來實現具體功能。另一種適配器模式是對象適配器,它不是使用多繼承或繼承再實現的方式,而是使用直接關聯,或者稱爲委託的方式,類圖以下:圖片

輸入圖片說明

2、代碼以下:

// 適配器類,直接關聯被適配類,同時實現標準接口  
    class Adapter implements Target{  
        // 直接關聯被適配類  
        private Adaptee adaptee;  
          
        // 能夠經過構造函數傳入具體須要適配的被適配類對象  
        public Adapter (Adaptee adaptee) {  
            this.adaptee = adaptee;  
        }  
          
        public void request() {  
            // 這裏是使用委託的方式完成特殊功能  
            this.adaptee.specificRequest();  
        }  
    }  
      
    // 測試類  
    public class Client {  
        public static void main(String[] args) {  
            // 使用普通功能類  
            Target concreteTarget = new ConcreteTarget();  
            concreteTarget.request();  
              
            // 使用特殊功能類,即適配類,  
            // 須要先建立一個被適配類的對象做爲參數  
            Target adapter = new Adapter(new Adaptee());  
            adapter.request();  
        }  
    }

3、描述

測試結果與上面的一致。從類圖中咱們也知道須要修改的只不過就是 Adapter 類的內部結構,即 Adapter 自身必須先擁有一個被適配類的對象,再把具體的特殊功能委託給這個對象來實現。使用對象適配器模式,可使得 Adapter 類(適配類)根據傳入的 Adaptee 對象達到適配多個不一樣被適配類的功能,固然,此時咱們能夠爲多個被適配類提取出一個接口或抽象類。這樣看起來的話,彷佛對象適配器模式更加靈活一點。ci

8. 模式總結

一 、 優勢

一、 經過適配器,客戶端能夠調用同一接口,於是對客戶端來講是透明的。這樣作更簡單、更直接、更緊湊。

二、 複用了現存的類,解決了現存類和複用環境要求不一致的問題。

三、 將目標類和適配者類解耦,經過引入一個適配器類重用現有的適配者類,而無需修改原有代碼。

四、 一個對象適配器能夠把多個不一樣的適配者類適配到同一個目標,也就是說,同一個適配器能夠把適配者類和它的子類都適配到目標接口。

2、 缺點

一、對於對象適配器來講,更換適配器的實現過程比較複雜。

3、 適用場景

一、系統須要使用現有的類,而這些類的接口不符合系統的接口。

二、想要創建一個能夠重用的類,用於與一些彼此之間沒有太大關聯的一些類,包括一些可能在未來引進的類一塊兒工做。

三、兩個類所作的事情相同或類似,可是具備不一樣接口的時候。

四、舊的系統開發的類已經實現了一些功能,可是客戶端卻只能以另外接口的形式訪問,但咱們不但願手動更改原有類的時候。

五、使用第三方組件,組件接口定義和本身定義的不一樣,不但願修改本身的接口,可是要使用第三方組件接口的功能。

相關文章
相關標籤/搜索