我的在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7897843java
ADAPTER(適配器) app
一、 意圖ide
將一個類的接口轉換成客戶但願的另外一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。this
二、 別名.net
包裝器Wrapper代理
三、 適用性指針
四、 結構code
類適配器使用多重繼承對一個接口與另外一個接口進行匹配。因爲Java不支持多重繼承,因此目前沒有涉及。以下圖所示:對象
對象匹配器依賴於對象組合,以下圖所示:blog
五、 參與者
Target——定義Client使用的與特定領域相關的接口。
Client——與符合Target接口的對象協調。
Adaptee——定義一個已經存在的接口,這個接口須要適配器。
Adapter——對Adaptee的接口與Target接口進行適配。
六、 協做
Client在Adapter實例上調用一些操做。接着適配器調用Adapter的操做實現這個請求。
七、 效果
類適配器和對象適配器有不一樣的權衡。
類適配器:
對象適配器:
使用Adapter模式時須要考慮的其餘一些因素有:
1) Adapter的匹配程度。對Adapter的接口與Target的接口進行匹配的工做量各個Adapter可能不同。工做範圍多是,從簡單的接口轉換到支持徹底不一樣的操做集合。Adapter的工做量取決於Target接口與Adapter接口的類似程度。
2) 可插入的Adapter。當其餘的類使用一個類時,若是所須要的假定條件越少,這個類就更具複用性。若是將接口匹配構建爲一個類,就不須要假定對其餘的類 可見的是一個相同的接口。也就是說,接口匹配使得咱們能夠將本身的類加入到一些現有的系統中去,而這些系統對這個類的接口可能會有所不一樣。
3) 使用雙向適配器提供透明操做。使用適配器的一個潛在問題是,它們不對全部的客戶都透明。被適配的對象再也不兼容Adapter的接口,所以並非全部 Adapter對象能夠被使用的地方均可以被使用。雙向適配器提供了這樣的透明性。在兩個不一樣的客戶須要用不一樣的方式查看同一個對象時,雙向適配器尤爲有 用。
八、 代碼示例
Target
package com.examples.pattern.adapter; /** * 定義客戶端使用的接口,與特定領域相關 */ public interface Target { public void request(); }Adaptee
package com.examples.pattern.adapter; /** * 已經存在的接口或類 */ public class Adaptee { public void specifiRequest(){ System.out.println("adaptee's specifiRequest"); } }Adapter
package com.examples.pattern.adapter; /** * 適配器 */ public class Adapter implements Target { /** * 持有須要被適配的接口對象 */ private Adaptee adaptee; /** * 構造方法,傳入須要被適配的對象 * * @param adaptee * 須要被適配的對象 */ public Adapter(Adaptee adaptee) { this.adaptee = adaptee; } @Override public void request() { adaptee.specifiRequest(); System.out.println("this is the Adapter's request"); } }Client
package com.examples.pattern.adapter; public class Client { public static void main(String[] args) { //建立須要適配的對象 Adaptee adaptee = new Adaptee(); //建立客戶端須要調用的接口對象 Target target = new Adapter(adaptee); //請求處理 target.request(); } }
Bridge模式的結構與對象適配器類似,可是Bridge模式的出發點不一樣:Bridge目的是將接口部分和實現部分分離,從而對它們能夠較爲容易也相對獨立地加以改變。而Adapter則意味着改變一個已有對象的接口。
Decorator模式加強了其餘對象的功能而同時又不改變它的接口。所以decorator對應用程序的透明性比適配器要好。結果是decorator支持遞歸組合,而純粹使用適配器是不可能實現這一點的。
Proxy模式在不改變它的接口的條件下,爲另外一個對象定義了一個代理。