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
*/