設計模式之介面卡模式(結構型)
@[toc]
模式定義
介面卡模式(Adapter Pattern):將一個介面轉換成客戶希望的介面,介面卡模式使介面不相容的那些類可以一起工作,其別名為包裝器(Wrapper)。介面卡模式既可以作為類結構型模式,也可以作為物件結構型模式。
模式角色
介面卡模式包括如下角色
- Traget(目標抽象類)
- Adapter(介面卡類)
- Adaptee(適配者類)
- Client(客戶類)
模式分析
介面卡模式將目標類和適配者類解耦,引入一個介面卡類來重用適配者類,具體的實現是在適配者類的,通過介面卡模式,客戶端類就不知道適配者類的具體實現了,
典型的類介面卡程式碼:
public class Adapter extends Adaptee implements Target { public void request() { specificRequest(); } }
典型的物件介面卡程式碼:
public class Adapter extends Adaptee implements Target { public void request() { specificRequest(); } }
模式例子
某系統需要提供一個加密模組,將使用者資訊(如密碼等機密資訊)加密之後再儲存在資料庫中,系統已經定義好了資料庫操作類。為了提高開發效率,現需要重用已有的加密演算法,這些演算法封裝在一些由第三方提供的類中,有些甚至沒有原始碼。使用介面卡模式設計該加密模組,實現在不修改現有類的基礎上重用第三方加密方法
本例子來自《設計模式》 一書
目標類:
public abstract class DataOperation { private String password; public void setPassword(String password) { this.password=password; } public String getPassword() { return this.password; } public abstract String doEncrypt(int key,String ps); }
適配者類:
public final class Caesar { public String doEncrypt(int key,String ps) { String es=""; for(int i=0;i<ps.length();i++) { char c=ps.charAt(i); if(c>='a'&&c<='z') { c+=key%26; if(c>'z') c-=26; if(c<'a') c+=26; } if(c>='A'&&c<='Z') { c+=key%26; if(c>'Z') c-=26; if(c<'A') c+=26; } es+=c; } return es; } }
介面卡類:
public class CipherAdapter extends DataOperation { private Caesar cipher; public CipherAdapter() { cipher=new Caesar(); } public String doEncrypt(int key,String ps) { return cipher.doEncrypt(key,ps); } }
public class NewCipherAdapter extends DataOperation { private NewCipher cipher; public NewCipherAdapter() { cipher=new NewCipher(); } public String doEncrypt(int key,String ps) { return cipher.doEncrypt(key,ps); } }
模式分類
介面卡模式可以分為預設介面卡和雙向介面卡
預設介面卡
在介面卡中同時包含對目標類和適配者類的引用,適配者可以通過它呼叫目標類中的方法,目標類也可以通過它呼叫適配者類中的方法,它適用於一個介面不想使用其所有的方法的情況。因此也稱為單介面介面卡模式。
雙向介面卡
如果在物件介面卡中,在介面卡中同時包含對目標類和適配者類的引用,適配者可以通過它呼叫目標類中的方法,目標類也可以通過它呼叫適配者類中的方法,那麼這個介面卡就是一個雙向介面卡
模式應用
- JDBC驅動軟體都是一個介於jdbc介面和資料庫引擎介面之間的介面卡軟體。JDBC驅動軟體使java程式可以適配各種資料庫引擎
- Spring AOP框架中,對BeforeAdvice、AfterAdvice、ThrowsAdvice三種通知型別藉助介面卡模式來實現。