適配器模式在設計模式體系中屬於結構型模式,能夠分爲三類:類的適配器模式、對象的適配器模式和接口的適配器模式,因爲類和接口的適配器模式須要適配器繼承原有的類,而純面嚮對象語言Java、C#都是不支持多繼承的,這在必定程度上制約了類和接口的適配器模式的使用場景,故使用的時候要注意。java
使用目的:將一個類的接口轉換成客戶但願的另一個接口。適配器模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。設計模式
說明:app
當新接口出現的時候,因爲和老的接口不兼容,這個時候,咱們採用一個適配器類實現新的接口而且繼承老的業務類,這樣就能同時處理新老業務。ide
示例代碼:spa
/** * 原始類 */ class Source { public void oldFunction() { System.out.println("oldFunction:Source"); } } interface Target { void oldFunction(); // 新接口 void newFunction(); } // 適配器,用來作接口轉換 class Adapter extends Source implements Target { public Adapter() { super(); } @Override public void newFunction() { System.out.println("newFunction:Adapter"); } } public class A { public static void main(String args[]) { Target target = new Adapter(); target.oldFunction(); target.newFunction(); } }
輸出:.net
oldFunction:Source
newFunction:Adapter設計
說明:當新接口出現的時候,因爲和老的接口不兼容,這個時候,咱們採用一個適配器類實現新的接口並在內部持有一個老業務邏輯的對象,這樣就能把對老接口的調用所有中轉給老的業務邏輯,從而解決接口的兼容性問題code
示例代碼:對象
/** * 原始類 */ class Source { public void oldFunction() { System.out.println("oldFunction:Source"); } } interface Target { void oldFunction(); // 新接口 void newFunction(); } // 適配器,用來作接口轉換 class Adapter implements Target { // 適配器內部持有的原始類對象 private Source mSource; public Adapter(Source source) { mSource = source; } @Override public void oldFunction() { // 這裏調用原始類中的方法 mSource.oldFunction(); } @Override public void newFunction() { System.out.println("newFunction:Adapter"); } } public class A { public static void main(String args[]) { Source source = new Source(); Target target = new Adapter(source); target.oldFunction(); target.newFunction(); } }
輸出:blog
oldFunction:Source
newFunction:Adapter
說明:也叫缺省適配器模式,主要解決接口的複用問題:有時候可能咱們的業務只須要使用接口中的某一個方法而不是所有方法,可是因爲接口的語言特性而不得不實現所有的抽象方法,這樣就會使得接口的使用過程很麻煩,特別是接口中存在不少抽象方法的時候。面對接口的這類問題,咱們能夠採用一個抽象類(也能夠不是抽象類)去實現接口,而後讓咱們的類去繼承這個抽象類同時只重寫咱們感興趣的方法便可。
示例代碼:
interface Target { void function1(); void function2(); void function3(); void function4(); } //TargetWrapper實現了Target接口,並給出了默認實現 abstract class TargetWrapper implements Target { @Override public void function1() { System.out.println("function1:TargetWrapper"); } @Override public void function2() { } @Override public void function3() { } @Override public void function4() { } } // 適配器,繼承TargetWrapper,重寫本身感興趣的方法 class Adapter extends TargetWrapper { public Adapter() { super(); } @Override public void function2() { System.out.println("function4:Adapter"); } } public class A { public static void main(String args[]) { Target target = new Adapter(); target.function1(); target.function2(); } }
輸出:
function1:TargetWrapper function4:Adapter