設計模式——適配器

我的在CSDN上的BLOG:http://blog.csdn.net/feb13/article/details/7897843java

ADAPTER(適配器) app

一、 意圖ide

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

二、 別名.net

包裝器Wrapper代理

三、 適用性指針

  • 你想使用一個已經存在的類,而它的接口不符合你的需求。
  • 你想建立一個能夠複用的類,該類能夠與其餘不相關的類或不可預見的類(即那些接口可能不必定兼容的類)協調工做。
  • (僅適用於對象Adapter)你想使用一些已經存在的子類,可是不可能對每個都進行子類化以匹配它們的接口。對象適配器能夠適配它的父類接口。

四、 結構code

類適配器使用多重繼承對一個接口與另外一個接口進行匹配。因爲Java不支持多重繼承,因此目前沒有涉及。以下圖所示:對象

對象匹配器依賴於對象組合,以下圖所示:blog

五、 參與者

Target——定義Client使用的與特定領域相關的接口。

Client——與符合Target接口的對象協調。

Adaptee——定義一個已經存在的接口,這個接口須要適配器。

Adapter——對Adaptee的接口與Target接口進行適配。

六、 協做

Client在Adapter實例上調用一些操做。接着適配器調用Adapter的操做實現這個請求。

七、 效果

類適配器和對象適配器有不一樣的權衡。

類適配器:

  •  用一個具體的Adapter類對Adaptee和Target進行匹配。結果是當咱們想要匹配一個類及全部它的子類時,類Adapter將不能勝任工做。
  • 使得Adapter能夠重定義Adaptee的部分行爲,由於Adapter是Adaptee的一個子類。
  • 僅僅引入一個對象,並不須要額外的指針以間接獲得adaptee。

對象適配器:

  • 容許一個Adapter與多個Adaptee——即Adapter自己以及它的全部子類(若是有子類的話)——同時工做。Adapter也能夠一次給全部的Adaptee添加功能。
  • 使得重定義Adaptee的行爲比較困難。這就須要生成Adapter的子類而且使得Adapter引用這個子類而不是引用Adaptee自己。

使用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模式在不改變它的接口的條件下,爲另外一個對象定義了一個代理。

相關文章
相關標籤/搜索