將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。函數
即Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠在一塊兒工做。測試
一 目標接口(Target):客戶所期待的接口。目標能夠是具體的或抽象的類,也能夠是接口。this
二 須要適配的類(Adaptee):須要適配的類或適配者類。code
三 適配器(Adapter):經過包裝一個須要適配的對象,把原接口轉換成目標接口。 對象
1、類的適配器模式(採用繼承實現)繼承
2、對象適配器(採用對象組合方式實現)接口
// 已存在的、具備特殊功能、但不符合咱們既有的標準接口的類 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(); } }
普通類 具備 普通功能... 被適配類具備 特殊功能...
上面這種實現的適配器稱爲類適配器,由於 Adapter 類既繼承了 Adaptee (被適配類),也實現了 Target 接口(由於 Java 不支持多繼承,因此這樣來實現),在 Client 類中咱們能夠根據須要選擇並建立任一種符合需求的子類,來實現具體功能。另一種適配器模式是對象適配器,它不是使用多繼承或繼承再實現的方式,而是使用直接關聯,或者稱爲委託的方式,類圖以下:圖片
// 適配器類,直接關聯被適配類,同時實現標準接口 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(); } }
測試結果與上面的一致。從類圖中咱們也知道須要修改的只不過就是 Adapter 類的內部結構,即 Adapter 自身必須先擁有一個被適配類的對象,再把具體的特殊功能委託給這個對象來實現。使用對象適配器模式,可使得 Adapter 類(適配類)根據傳入的 Adaptee 對象達到適配多個不一樣被適配類的功能,固然,此時咱們能夠爲多個被適配類提取出一個接口或抽象類。這樣看起來的話,彷佛對象適配器模式更加靈活一點。ci