亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

java設(shè)計(jì)模式筆記之適配器模式

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

適配器(Adapter)模式:

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

生活中的場(chǎng)景:

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

2、給筆記本電腦的usb接口插入臺(tái)式機(jī)的ps/2接口的鍵盤,需要一個(gè)usb和ps/2的接口轉(zhuǎn)接器,此時(shí)usb和ps/2的接口轉(zhuǎn)接器就充當(dāng)了適配器的角色。

usb和ps/2的接口轉(zhuǎn)接器

通用類圖:

通用類圖

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

適配器模式中的角色:

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

適配器模式的結(jié)構(gòu):

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

類的適配器模式把適配的類的API轉(zhuǎn)換成為目標(biāo)類的API。

對(duì)象的適配器模式與類的適配器模式一樣,對(duì)象的適配器模式把被適配的類的API轉(zhuǎn)換成為目標(biāo)類的API,與類的適配器模式不同的是,對(duì)象的適配器模式不是使用繼承關(guān)系連接到Adaptee類,而是使用委派關(guān)系連接到Adaptee類。

類的適配器模式

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

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

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

2、創(chuàng)建一個(gè)目標(biāo)接口,能處理一些特殊請(qǐng)求

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

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

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


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

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

/**
 * 客戶端類
 * (相當(dā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); 
  }  
}

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

對(duì)象的適配器模式

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

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

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

2、創(chuàng)建一個(gè)目標(biāo)接口,能處理一些特殊請(qǐng)求

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

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

/**
 * 適配器 (對(duì)象適配器方式,使用了組合的方式跟被適配對(duì)象整合)
 * (相當(dāng)于usb和ps/2的轉(zhuǎn)接器)
 * @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)建一個(gè)客戶端

/**
 * 客戶端類
 * (相當(dā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 類的內(nèi)部結(jié)構(gòu),即 Adapter 自身必須先擁有一個(gè)被適配類的對(duì)象,再把具體的特殊功能委托給這個(gè)對(duì)象來(lái)實(shí)現(xiàn)。使用對(duì)象適配器模式,可以使得 Adapter 類(適配類)根據(jù)傳入的 Adaptee 對(duì)象達(dá)到適配多個(gè)不同被適配類的功能,當(dāng)然,此時(shí)我們可以為多個(gè)被適配類提取出一個(gè)接口或抽象類。這樣看起來(lái)的話,似乎對(duì)象適配器模式更加靈活一點(diǎn)。

類適配器和對(duì)象適配器的權(quán)衡:

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

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

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

更好的復(fù)用性:

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

更好的擴(kuò)展性:

在實(shí)現(xiàn)適配器功能的時(shí)候,可以調(diào)用自己開發(fā)的功能,從而自然地?cái)U(kuò)展系統(tǒng)的功能。
適配器模式的缺點(diǎn)

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

適配器模式在工作中的場(chǎng)景:

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

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

    Java面試題沖刺第十六天--消息隊(duì)列

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

    SpringBoot整合Web之AOP配置詳解

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

    Spring?Boot項(xiàng)目中遇到`if-else`語(yǔ)句七種具體使用方法解析

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

    j2ee之AJAX二級(jí)聯(lián)動(dòng)效果

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

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

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

    java中vector與hashtable操作實(shí)例分享

    java中vector與hashtable操作實(shí)例,有需要的朋友可以參考一下
    2014-01-01
  • SpringMvc返回modelandview返回的頁(yè)面無(wú)法跳轉(zhuǎn)問題及解決

    SpringMvc返回modelandview返回的頁(yè)面無(wú)法跳轉(zhuǎn)問題及解決

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

    解決Mybatis的@Param()注解導(dǎo)致分頁(yè)失效的問題

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

    使用SpringBoot代碼詳細(xì)解釋<List>的用法

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

    Spring事務(wù)注解@Transactional失效的八種場(chǎng)景分析

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

最新評(píng)論