1. 程式人生 > >不相容結構的協調——介面卡模式(一)

不相容結構的協調——介面卡模式(一)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               

      我的膝上型電腦的工作電壓是20V,而我國的家庭用電是220V,如何讓20V的膝上型電腦能夠在220V的電壓下工作?答案是引入一個電源介面卡(AC Adapter)

,俗稱充電器或變壓器,有了這個電源介面卡,生活用電和膝上型電腦即可相容,如圖9-1所示:

9-1 電源介面卡示意圖

      在軟體開發中,有時也存在類似這種不相容的情況,我們也可以像引入一個電源介面卡一樣引入一個稱之為介面卡的角色來協調這些存在不相容的結構,這種設計方案即為介面卡模式。

 

9.1 沒有原始碼的演算法庫

       Sunny軟體公司在很久以前曾開發了一個演算法庫,裡面包含了一些常用的演算法,例如排序演算法和查詢演算法,在進行各類軟體開發時經常需要重用該演算法庫中的演算法。在為某學校開發教務管理系統時,開發人員發現需要對學生成績進行排序和查詢,該系統的設計人員已經開發了一個成績操作介面ScoreOperation

,在該介面中聲明瞭排序方法sort(int[]) 和查詢方法search(int[], int),為了提高排序和查詢的效率,開發人員決定重用演算法庫中的快速排序演算法類QuickSort和二分查詢演算法類BinarySearch,其中QuickSortquickSort(int[])方法實現了快速排序,BinarySearch binarySearch (int[], int)方法實現了二分查詢。

       由於某些原因,現在Sunny公司開發人員已經找不到該演算法庫的原始碼,無法直接通過複製和貼上操作來重用其中的程式碼;部分開發人員已經針對ScoreOperation

介面程式設計,如果再要求對該介面進行修改或要求大家直接使用QuickSort類和BinarySearch類將導致大量程式碼需要修改。

       Sunny軟體公司開發人員面對這個沒有原始碼的演算法庫,遇到一個幸福而又煩惱的問題:如何在既不修改現有介面又不需要任何演算法庫程式碼的基礎上能夠實現演算法庫的重用?

       通過分析,我們不難得知,現在Sunny軟體公司面對的問題有點類似本章最開始所提到的電壓問題,成績操作介面ScoreOperation好比只支援20V電壓的筆記本,而演算法庫好比220V的家庭用電,這兩部分都沒有辦法再進行修改,而且它們原本是兩個完全不相關的結構,如圖9-2所示:

9-2 需協調的兩個系統的結構示意圖

       現在我們需要ScoreOperation介面能夠和已有演算法庫一起工作,讓它們在同一個系統中能夠相容,最好的實現方法是增加一個類似電源介面卡一樣的介面卡角色,通過介面卡來協調這兩個原本不相容的結構。如何在軟體開發中設計和實現介面卡是本章我們將要解決的核心問題,下面就讓我們正式開始學習這種用於解決不相容結構問題的介面卡模式。

 

9.2 介面卡模式概述

       與電源介面卡相似,在介面卡模式中引入了一個被稱為介面卡(Adapter)的包裝類,而它所包裝的物件稱為適配者(Adaptee),即被適配的類。介面卡的實現就是把客戶類的請求轉化為對適配者的相應介面的呼叫。也就是說:當客戶類呼叫介面卡的方法時,在介面卡類的內部將呼叫適配者類的方法,而這個過程對客戶類是透明的,客戶類並不直接訪問適配者類。因此,介面卡讓那些由於介面不相容而不能互動的類可以一起工作。

       介面卡模式可以將一個類的介面和另一個類的介面匹配起來,而無須修改原來的適配者介面和抽象目標類介面。介面卡模式定義如下:

介面卡模式(Adapter Pattern):將一個介面轉換成客戶希望的另一個介面,使介面不相容的那些類可以一起工作,其別名為包裝器(Wrapper)。介面卡模式既可以作為類結構型模式,也可以作為物件結構型模式。

【注:在介面卡模式定義中所提及的介面是指廣義的介面,它可以表示一個方法或者方法的集合。】

       在介面卡模式中,我們通過增加一個新的介面卡類來解決介面不相容的問題,使得原本沒有任何關係的類可以協同工作。根據介面卡類與適配者類的關係不同,介面卡模式可分為物件介面卡和類介面卡兩種,在物件介面卡模式中,介面卡與適配者之間是關聯關係;在類介面卡模式中,介面卡與適配者之間是繼承(或實現)關係在實際開發中,物件介面卡的使用頻率更高,物件介面卡模式結構如圖9-3所示:

9-3 物件介面卡模式結構圖

       在物件介面卡模式結構圖中包含如下幾個角色:

       ● Target(目標抽象類):目標抽象類定義客戶所需介面,可以是一個抽象類或介面,也可以是具體類。

       ● Adapter(介面卡類):介面卡可以呼叫另一個介面,作為一個轉換器,對AdapteeTarget進行適配,介面卡類是介面卡模式的核心,在物件介面卡中,它通過繼承Target並關聯一個Adaptee物件使二者產生聯絡。

       ● Adaptee(適配者類):適配者即被適配的角色,它定義了一個已經存在的介面,這個介面需要適配,適配者類一般是一個具體類,包含了客戶希望使用的業務方法,在某些情況下可能沒有適配者類的原始碼。

       根據物件介面卡模式結構圖,在物件介面卡中,客戶端需要呼叫request()方法,而適配者類Adaptee沒有該方法,但是它所提供的specificRequest()方法卻是客戶端所需要的。為了使客戶端能夠使用適配者類,需要提供一個包裝類Adapter,即介面卡類。這個包裝類包裝了一個適配者的例項,從而將客戶端與適配者銜接起來,在介面卡的request()方法中呼叫適配者的specificRequest()方法。因為介面卡類與適配者類是關聯關係(也可稱之為委派關係),所以這種介面卡模式稱為物件介面卡模式。典型的物件介面卡程式碼如下所示:

class Adapter extends Target private Adaptee adaptee; //維持一個對適配者物件的引用  public Adapter(Adaptee adaptee) {  this.adaptee=adaptee; }  public void request() {  adaptee.specificRequest(); //轉發呼叫 }}

 

 

疑問思考

       在物件介面卡中,一個介面卡能否適配多個適配者?如果能,應該如何實現?如果不能,請說明原因?

 

【作者:劉偉  http://blog.csdn.net/lovelion

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述