結構型-介面卡模式

小弟季義欽發表於2013-03-28
package adapter;
/**
 * @author jiq
 * 型別:Structural
 * 定義: 介面卡模式將一個類的介面,轉換成客戶期望的另一個介面。介面卡模式讓原本
 * 		介面不相容的類,現在可以合作無間。
 * 
 * OO原則:使用物件組合,以修改的介面來包裝被適配者。 
 * 		我們繫結的是客戶(使用介面卡一方)和介面,而不是繫結客戶和實現。
 * 
 * 與裝飾器模式的區別: 介面卡模式“將一個介面轉換成另一個介面”,
 * 		而裝飾器模式“不改變任何介面,而是加入新的責任”。
 * 
 * 分類: 物件介面卡(如下例項),類介面卡(不常用)
 * 
 * 另外一個改變介面的模式: Facade(外觀)模式,但是它改變介面的原因是為了簡化介面。
 * 
 * 程式碼說明: 我有一個顯示器Monitor,是用來顯示圖形的,它只能接收來自圖形傳送裝置
 * 		GrapTransmitter的訊號,但是我現在只有一個CPU,他所能產生的資料無法被顯示器
 * 		識別,即這兩個裝置不是相容的。 這個時候我們就需要一個圖形介面卡GrapAdapter,
 * 		能夠將CPU適配於顯示器。
 */
//顯示器
class Monitor{
	GrapTransmitter gt;
	public Monitor(GrapTransmitter gt){
		this.gt = gt;
	}
	//顯示圖形傳送裝置傳送過來的圖形資料
	public void showGrap(){
		System.out.println(gt.getGrapData());
	}
}

//圖形傳送裝置
class GrapTransmitter{
	public String getGrapData(){
		return "grap Content";
	}
}

//現在我只有一個CPU
class CPU{
	//只能產生CPU資料
	public int getCpuData(){
		return 10;
	}
}

/**
 * 我們需要一個圖形介面卡,繼承某一方(如這裡GrapTransmitter),
 * 同時內部包含一個被適配的類(CPU),通過重寫其父類的方法來進行適配。
 * */
class GrapAdapter extends GrapTransmitter{
	private CPU cpu;	//組合被適配的類
	public GrapAdapter(CPU cpu){
		this.cpu = cpu;
	}
	
	//重寫父類的介面
	public String getGrapData(){
		return String.valueOf(cpu.getCpuData());
	}
}

public class Adapter {
	public static void main(String[] args) {
		
		//用圖形介面卡包裝CPU,轉換成顯示器期望的圖形傳送裝置
		GrapTransmitter gt = new GrapAdapter(new CPU());
		
		//利用該圖形傳送裝置建立一個顯示器
		Monitor monitor = new Monitor(gt);
		monitor.showGrap();
	}
}/**
 * output: 10
 */


相關文章