一、意圖:ide
將一個類的接口轉換成客戶但願的另一個接口。Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的那些類能夠一塊兒工做。測試
二、場景描述:spa
手機的Usb數據線能夠被看作適配器,不一樣類型的手機經過不一樣的Usb數據線鏈接到電腦相同的usb接口上。幾年前的非智能手機,數據線鏈接手機的一端因爲手機品牌的不一樣使用了各式各樣的接口,可是鏈接電腦的一端卻採用了相同usb接口。針對特定品牌的數據線使得每種不一樣的手機均可以鏈接到電腦的usb接口上,使得手機接口能夠與電腦的usb接口協同工做。code
另外,C++中的棧(stack)、隊列(queue)被稱做容器適配器,它們自己都是基於線性表來實現的,可是對外提供了特定的操做接口,如stack的LIFO(last-in first-out)特性。對象
三、適配器模式類圖:blog
對象適配器類圖:繼承
角色:接口
協做:隊列
注:get
四、適用性:
五、實例類圖:
說明:
六、代碼實例:
手機端口類,含有手機端口的信息,對應適配器模式中的Adaptee。
1 package com.crazysnail.adapter; 2 3 public class PhonePort { 4 public void getPhonePort(){ 5 System.out.println("我是一個手機接口"); 6 } 7 }
Usb端口類,知足將設備鏈接到電腦的新需求,對應適配器模式中的Target。
1 package com.crazysnail.adapter; 2 3 public class UsbPort { 4 public void getUsbPort(){ 5 System.out.println("我是一個usb接口"); 6 } 7 }
數據線類,一端鏈接到手機端口,開放數據線另外一端的usb接口,對應適配器模式中的Adapter。
1 package com.crazysnail.adapter; 2 3 public class UsbDataLine extends UsbPort{ 4 private PhonePort phonePort; 5 6 public UsbDataLine() { 7 System.out.println("獲取一條匹配特性型號手機的數據線"); 8 phonePort = new PhonePort(); 9 } 10 11 @Override 12 public void getUsbPort(){ 13 phonePort.getPhonePort(); 14 System.out.println("手機接口鏈接到數據線一端,開放數據線的usb接口一端"); 15 } 16 }
人類類,有鏈接手機到電腦的需求,使用數據線將手機鏈接到電腦,對應適配器模式中的Client。
1 package com.crazysnail.adapter; 2 3 public class Human { 4 public static void linkPhoneToComputer(UsbDataLine line){ 5 line.getUsbPort(); 6 System.out.println("將Usb接口鏈接到電腦"); 7 } 8 }
測試類,效果演示。
1 package com.crazysnail.adapter; 2 3 public class AdapterTest { 4 public static void main(String[] args){ 5 UsbDataLine newUsbDataLine = new UsbDataLine(); 6 7 Human.linkPhoneToComputer(newUsbDataLine); 8 } 9 }
效果圖:
七、適配器模式的特色