結構型—適配器模式

一、意圖:ide

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

二、場景描述:spa

  手機的Usb數據線能夠被看作適配器,不一樣類型的手機經過不一樣的Usb數據線鏈接到電腦相同的usb接口上。幾年前的非智能手機,數據線鏈接手機的一端因爲手機品牌的不一樣使用了各式各樣的接口,可是鏈接電腦的一端卻採用了相同usb接口。針對特定品牌的數據線使得每種不一樣的手機均可以鏈接到電腦的usb接口上,使得手機接口能夠與電腦的usb接口協同工做。code

  另外,C++中的棧(stack)、隊列(queue)被稱做容器適配器,它們自己都是基於線性表來實現的,可是對外提供了特定的操做接口,如stack的LIFO(last-in first-out)特性。對象

三、適配器模式類圖:blog

  對象適配器類圖:繼承

  

角色接口

  • Client:用戶類,使用新接口Target來完成某些特定的需求。
  • Target:新的接口類,開放特定接口request來完成某些特定操做,與Client協做。
  • Adaptee:原有的類。
  • Adapter:適配器類,將Adaptee中的接口封裝成Target中的新接口,來知足新的需求。

協做隊列

  • Client調用Adapter實例的操做,Adapter使用Adaptee來完成這些被調用的操做。

get

  • 類圖中表示的是適配器模式兩種類圖中的對象適配器類圖,另一種類適配器經過多重繼承兩個類或實現兩個接口來實現。

四、適用性:

  • 使用一個本來存在的類來知足新的需求,可是原來的類與新的需求類接口不一致。
  • 但願複用原有的類,可是某些方法在原有的類中不存在,經過Adapter類來修改原來類Adaptee中的接口,而且添加Adaptee中不存在的方法。

五、實例類圖:

  

說明

  • UsbPort、PhonePort分別是電腦Usb端口、手機端口的類定義信息。
  • Human的將手機鏈接到電腦的操做(linkPhoneToComputer)使用UsbDataLine來完成。

六、代碼實例:

  手機端口類,含有手機端口的信息,對應適配器模式中的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 }

  效果圖:

七、適配器模式的特色

  • 實現了類的複用,利用了原有的Adaptee類,經過Adapter接口的包裝或改造,知足了新需求。
  • 當須要衝定義Adaptee類時,可能會影響到Adapter中的操做。
相關文章
相關標籤/搜索