Java設計模式--適配器模式

概述

在生活中如果兩個不同語言的人怎麼溝通呢?翻譯器。電源有二相插座,但是你是三相插頭,那你怎麼充電呢?插座適配器。電腦要在不同的國家使用,但是每個國家的電壓標準不一樣,那你怎麼使用呢?電源適配器。這些物品就是我們適配器模式中的適配器。

概念

適配器模式定義:適配器模式將一個類的接口,轉換成客戶期望的另一個接口,使得原本由於接口不兼容而不能一起工作的那些類可以在一起工作
適配器模式類圖
Client:客戶端
Target:目標接口
Adapter:適配器
Adaptee:被適配類
在我們適用ListView的時候就是使用了適配器模式

適配器模式代碼實現

我們就用插座適配器來舉例吧。那我們的客戶端是什麼呢?電腦,目標接口:三相接口,適配器:電源適配器,被適配類:二相電流。
ThreePlugIf.java

package com.xjh.adapter;
/*
 * 三相插座接口(被適配類)
 */
public interface ThreePlugIf {

	//使用三相電流供電
	public void powerWithThree();
}

GBTwoPlug.java

package com.xjh.adapter;
/*
 * 使用國標二相電流(目標接口)
 */
public class GBTwoPlug {

	//使用二相電流供電
	public void powerWithTwo() {
		System.out.println("使用二相電流供電");
	}
}

我們讓適配器實現ThreePlugIf接口,然後在內部擁有GBTwoPlug的引用(初始化時傳入),在ThreePlugIf接口的powerWithThree方法中調用GBTwoPlug的powerWithTwo方法。
TwoPlugAdapter.java

package com.xjh.adapter;
/**
 * 二相轉三相的插座適配器
 * @author Gin
 *
 */
public class TwoPlugAdapter implements ThreePlugIf {

	private GBTwoPlug plug;
	
	public TwoPlugAdapter(GBTwoPlug plug) {
		this.plug = plug;
	}
	
	@Override
	public void powerWithThree() {
		// TODO Auto-generated method stub
		System.out.println("通過轉換");
		plug.powerWithTwo();
	}

}

NoteBook.java

package com.xjh.adapter;
/**
 * 客戶端
 * @author Gin
 *
 */
public class NoteBook {
	
	private ThreePlugIf plug;
	
	public NoteBook(ThreePlugIf plug) {
		this.plug = plug;
	}
	
	//使用插座充電
	public void charge() {
		plug.powerWithThree();
	}

}

通過父類引用可以指向子類對象的特點實現三相接口使用二相插座。
Test.java

package com.xjh.adapter;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GBTwoPlug two = new GBTwoPlug();
		ThreePlugIf plug = new TwoPlugAdapter(two);
		NoteBook nb = new NoteBook(plug);
		nb.charge();
	}

}

這樣我們通過適配器的轉換就能夠使得效果的到實現了,這就是我們通過組合實現適配器模式的過程。
採用組合方式實現的適配器稱爲對象適配器,特點:把“被適配者”作爲一個對象組合到適配器類中,以修改目標接口包裝被適配類。
那如果我們要用繼承怎麼實現呢?就是繼承至被適配者,並且實現目標接口。
TwoPlugAdapterExtends.java

package com.xjh.adapter;
/**
 * 採用繼承方式的插座適配器
 * @author Gin
 *
 */
public class TwoPlugAdapterExtends extends GBTwoPlug implements ThreePlugIf {

	@Override
	public void powerWithThree() {
		// TODO Auto-generated method stub
		System.out.println("藉助繼承適配器");
		this.powerWithTwo();
	}

}

然後我們總結new出這個Adapter就可以了。
Test.java

package com.xjh.adapter;

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GBTwoPlug two = new GBTwoPlug();
		ThreePlugIf plug = new TwoPlugAdapterExtends();
		NoteBook nb = new NoteBook(plug);
		nb.charge();
	}

}

通過繼承的方式實現適配器稱爲類適配器,特點:通過多重繼承不兼容接口,實現對目標接口的匹配,單一的爲某個類而實現適配。
但是這兩種的實現是有什麼區別呢,通過對象適配器實現的服務於被適配類的所有子類,但是類適配器模式通過多重繼承不兼容接口,實現對目標接口的匹配,單一的爲某個類而實現適配的這樣一種模式。

優點

  • **透明:**通過適配器,客戶端可以調用同一接口,因而對客戶端來說是透明的
  • **重用:**複用了現存的類,解決了現存類和複用環境要求不一致的問題
  • **低耦合:**將目標類和適配者類解耦,通過引入一個適配器類重用現有的適配者類,而無需修改原有代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章