欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java設計模式筆記之適配器模式

 更新時間:2017年10月18日 09:13:26   作者:傳臣ヽ  
這篇文章主要為大家詳細介紹了java設計模式之適配器模式筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下

適配器(Adapter)模式:

適配器模式把一個類的接口變換成客戶端所期待的另一種接口,從而使原本因接口不匹配而無法在一起工作的兩個類能夠在一起工作。

生活中的場景:

1、筆記本電源適配器,可以將220v轉化為適合筆記本使用的電壓。

2、給筆記本電腦的usb接口插入臺式機的ps/2接口的鍵盤,需要一個usb和ps/2的接口轉接器,此時usb和ps/2的接口轉接器就充當了適配器的角色。

usb和ps/2的接口轉接器

通用類圖:

通用類圖

  在上面的通用類圖中,Cient 類最終面對的是 Target 接口(或抽象類),它只能夠使用符合這一目標標準的子類;而 Adaptee 類則是被適配的對象(也稱 源角色),因為它包含specific (特殊的)操作、功能等,所以我們想要在自己的系統(tǒng)中使用它,將其轉換成符合我們標準的類,使得 Client 類可以在透明的情況下任意選擇使用 ConcreteTarget 類或是具有特殊功能的 Adaptee 類。

適配器模式中的角色:

目標接口(Target):客戶所期待得到的接口。目標可以是具體的或抽象的類,也可以是接口。
需要適配的類(Adaptee):需要適配的接口或適配類。
適配器(Adapter):適配器類是本模式的核心。適配器通過包裝一個需要適配的對象,把源接口轉換成目標接口。顯然,這一角色不可以是接口,而必須是具體類。

適配器模式的結構:

適配器模式有類的適配器模式和對象的適配器模式兩種不同的形式。

類的適配器模式把適配的類的API轉換成為目標類的API。

對象的適配器模式與類的適配器模式一樣,對象的適配器模式把被適配的類的API轉換成為目標類的API,與類的適配器模式不同的是,對象的適配器模式不是使用繼承關系連接到Adaptee類,而是使用委派關系連接到Adaptee類。

類的適配器模式

1、創(chuàng)建一個被適配的類:

/**
 * 被適配的類
 * 已存在的、具有特殊功能、但不符合我們既有的標準接口的類
 * (相當于例子中的,PS/2鍵盤)
 * @author ChuanChen
 * 
 */
public class Adaptee {

  public void specificRequest(){
    System.out.println("可以完成客戶請求的需要的功能!");
  }
}

2、創(chuàng)建一個目標接口,能處理一些特殊請求

/**
 * 目標接口,或稱為標準接口
 * @author ChuanChen
 *
 */
public interface Target {
  void handleReq();
}

3、創(chuàng)建一個適配器 (類適配器方式)

/**
 * 適配器 (類適配器方式)
 * (相當于usb和ps/2的轉接器)
 * @author ChuanChen
 *
 */
public class Adapter extends Adaptee implements Target {


  @Override
  public void handleReq() {
    super.specificRequest();
  }
}

4、創(chuàng)建一個客戶端

/**
 * 客戶端類
 * (相當于例子中的筆記本,只有USB接口)
 * @author ChuanChen
 *
 */
public class Client {

  public void test(Target t){
    t.handleReq();
  }

  public static void main(String[] args) {
    Client c = new Client();
    Adaptee a = new Adaptee();
    Target t = new Adapter();
    c.test(t); 
  }  
}

  上面這種實現(xiàn)的適配器稱為類適配器,因為 Adapter 類既繼承了 Adaptee (被適配類),也實現(xiàn)了 Target 接口(因為 Java 不支持多繼承,所以這樣來實現(xiàn)),在 Client 類中我們可以根據(jù)需要選擇并創(chuàng)建任一種符合需求的子類,來實現(xiàn)具體功能。

對象的適配器模式

1、創(chuàng)建一個被適配的類:

/**
 * 被適配的類
 * 已存在的、具有特殊功能、但不符合我們既有的標準接口的類
 * (相當于例子中的,PS/2鍵盤)
 * @author ChuanChen
 * 
 */
public class Adaptee {

  public void specificRequest(){
    System.out.println("可以完成客戶請求的需要的功能!");
  }
}

2、創(chuàng)建一個目標接口,能處理一些特殊請求

/**
 * 目標接口,或稱為標準接口
 * @author ChuanChen
 *
 */
public interface Target {
  void handleReq();
}

3、創(chuàng)建一個適配器 (對象適配器方式,使用了組合的方式跟被適配對象整合)

/**
 * 適配器 (對象適配器方式,使用了組合的方式跟被適配對象整合)
 * (相當于usb和ps/2的轉接器)
 * @author ChuanChen
 *
 */

public class Adapter implements Target{

private Adaptee adaptee;

  @Override
  public void handleReq() {
    adaptee.specificRequest();
  }

  public Adapter(Adaptee adaptee) {
    super();
    this.adaptee = adaptee;
  }

}

4、創(chuàng)建一個客戶端

/**
 * 客戶端類
 * (相當于例子中的筆記本,只有USB接口)
 * @author ChuanChen
 *
 */
public class Client {

  public void test(Target t){
    t.handleReq();
  }

  public static void main(String[] args) {
    Client c = new Client();
    Adaptee a = new Adaptee();
    Target t = new Adapter(a);
    c.test(t);
  }  
}

  我們只需要修改 Adapter 類的內部結構,即 Adapter 自身必須先擁有一個被適配類的對象,再把具體的特殊功能委托給這個對象來實現(xiàn)。使用對象適配器模式,可以使得 Adapter 類(適配類)根據(jù)傳入的 Adaptee 對象達到適配多個不同被適配類的功能,當然,此時我們可以為多個被適配類提取出一個接口或抽象類。這樣看起來的話,似乎對象適配器模式更加靈活一點。

類適配器和對象適配器的權衡:

  • 類適配器使用對象繼承的方式,是靜態(tài)的定義方式;而對象適配器使用對象組合的方式,是動態(tài)組合的方式。
  • 對于類適配器,由于適配器直接繼承了Adaptee,使得適配器不能和Adaptee的子類一起工作,因為繼承是靜態(tài)的關系,當適配器繼承了Adaptee后,就不可能再去處理 Adaptee的子類了。
  • 對于對象適配器,一個適配器可以把多種不同的源適配到同一個目標。換言之,同一個適配器可以把源類和它的子類都適配到目標接口。因為對象適配器采用的是對象組合的關系,只要對象類型正確,是不是子類都無所謂。
  • 對于類適配器,適配器可以重定義Adaptee的部分行為,相當于子類覆蓋父類的部分實現(xiàn)方法。
  • 對于對象適配器,要重定義Adaptee的行為比較困難,這種情況下,需要定義Adaptee的子類來實現(xiàn)重定義,然后讓適配器組合子類。雖然重定義Adaptee的行為比較困難,但是想要增加一些新的行為則方便的很,而且新增加的行為可同時適用于所有的源。
  • 對于類適配器,僅僅引入了一個對象,并不需要額外的引用來間接得到Adaptee。
  • 對于對象適配器,需要額外的引用來間接得到Adaptee。

建議盡量使用對象適配器的實現(xiàn)方式,多用合成/聚合、少用繼承。當然,具體問題具體分析,根據(jù)需要來選用實現(xiàn)方式,最適合的才是最好的。

適配器模式的優(yōu)點:

更好的復用性:

系統(tǒng)需要使用現(xiàn)有的類,而此類的接口不符合系統(tǒng)的需要。那么通過適配器模式就可以讓這些功能得到更好的復用。  

更好的擴展性:

在實現(xiàn)適配器功能的時候,可以調用自己開發(fā)的功能,從而自然地擴展系統(tǒng)的功能。
適配器模式的缺點

過多的使用適配器,會讓系統(tǒng)非常零亂,不易整體進行把握。比如,明明看到調用的是A接口,其實內部被適配成了B接口的實現(xiàn),一個系統(tǒng)如果太多出現(xiàn)這種情況,無異于一場災難。因此如果不是很有必要,可以不使用適配器,而是直接對系統(tǒng)進行重構。

適配器模式在工作中的場景:

1、已經(jīng)存在的類的接口不符合我們的需求;
2、創(chuàng)建一個可以復用的類,使得該類可以與其他不相關的類或不可預見的類(即那些接口可能不一定兼容的類)協(xié)同工作;
3、在不對每一個都進行子類化以匹配它們的接口的情況下,使用一些已經(jīng)存在的子類。

適配器模式經(jīng)常用于舊系統(tǒng)改造和升級。如果我們的系統(tǒng)開發(fā)之后再也不需要維護,那么很多模式都是沒有必要的。但是不幸的是,事實上維護一個系統(tǒng)的代價往往是開發(fā)一個系統(tǒng)的數(shù)倍。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java面試題沖刺第十六天--消息隊列

    Java面試題沖刺第十六天--消息隊列

    這篇文章主要為大家分享了最有價值的三道關于消息隊列的面試題,涵蓋內容全面,包括數(shù)據(jù)結構和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08
  • SpringBoot整合Web之AOP配置詳解

    SpringBoot整合Web之AOP配置詳解

    面向切面編程(aspect-oriented programming,AOP)主要實現(xiàn)的目的是針對業(yè)務處理過程中的切面進行提取,諸如日志、事務管理和安全這樣的系統(tǒng)服務,從而使得業(yè)務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發(fā)的效率
    2022-08-08
  • Spring?Boot項目中遇到`if-else`語句七種具體使用方法解析

    Spring?Boot項目中遇到`if-else`語句七種具體使用方法解析

    當在Spring?Boot項目中遇到大量if-else語句時,優(yōu)化這些代碼變得尤為重要,因為它們不僅增加了維護難度,還可能影響應用程序的可讀性和性能,以下是七種具體的方法,用于在Spring?Boot項目中優(yōu)化和重構if-else語句,感興趣的朋友一起看看吧
    2024-07-07
  • j2ee之AJAX二級聯(lián)動效果

    j2ee之AJAX二級聯(lián)動效果

    這篇文章主要為大家詳細介紹了j2ee之AJAX二級聯(lián)動效果的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java統(tǒng)計一個字符串在另外一個字符串出現(xiàn)次數(shù)的方法

    Java統(tǒng)計一個字符串在另外一個字符串出現(xiàn)次數(shù)的方法

    這篇文章主要介紹了Java統(tǒng)計一個字符串在另外一個字符串出現(xiàn)次數(shù)的方法,涉及java字符串遍歷、正則匹配等相關操作技巧,需要的朋友可以參考下
    2018-03-03
  • java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例分享

    java中vector與hashtable操作實例,有需要的朋友可以參考一下
    2014-01-01
  • SpringMvc返回modelandview返回的頁面無法跳轉問題及解決

    SpringMvc返回modelandview返回的頁面無法跳轉問題及解決

    這篇文章主要介紹了SpringMvc返回modelandview返回的頁面無法跳轉問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 解決Mybatis的@Param()注解導致分頁失效的問題

    解決Mybatis的@Param()注解導致分頁失效的問題

    這篇文章主要介紹了解決Mybatis的@Param()注解導致分頁失效的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 使用SpringBoot代碼詳細解釋<List>的用法

    使用SpringBoot代碼詳細解釋<List>的用法

    List是Java集合框架中的一種數(shù)據(jù)結構,用于存儲一組有序的元素,使用List可以方便地向其中添加、刪除或者修改元素,也可以通過下標或者迭代器遍歷其中的元素,這篇文章主要介紹了用SpringBoot代碼詳細解釋<List>的用法,需要的朋友可以參考下
    2023-09-09
  • Spring事務注解@Transactional失效的八種場景分析

    Spring事務注解@Transactional失效的八種場景分析

    最近在開發(fā)采用Spring框架的項目中,使用了@Transactional注解,但發(fā)現(xiàn)事務注解失效了,所以這篇文章主要給大家介紹了關于Spring事務注解@Transactional失效的八種場景,需要的朋友可以參考下
    2021-05-05

最新評論