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

實(shí)例講解JAVA 適配器模式

 更新時(shí)間:2020年06月24日 17:06:18   作者:認(rèn)真對(duì)待世界的小白  
這篇文章主要介紹了JAVA 適配器模式的的相關(guān)資料,文中示例代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下

在講述這個(gè)模式之前,我們先看一個(gè)案例:中國(guó)球員去NBA打籃球

中國(guó)球員去NBA打籃球,可是他不懂英語(yǔ),所以聽(tīng)不懂教練安排的戰(zhàn)術(shù),所以現(xiàn)在有三種解決方式

1、球員學(xué)會(huì)英語(yǔ)。2、教練學(xué)會(huì)中文。3、請(qǐng)個(gè)翻譯。

1和2是長(zhǎng)久之計(jì),但不能解決迫在眉睫的問(wèn)題。請(qǐng)個(gè)翻譯是短暫的更好的選擇。

放在軟件設(shè)計(jì)層面上,這就叫做適配器模式。http://www.dbjr.com.cn/article/189484.htm

將一個(gè)類(lèi)的接口轉(zhuǎn)換成客戶(hù)希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類(lèi)可以一起工作。

在軟件開(kāi)發(fā)中,也就是系統(tǒng)的數(shù)據(jù)和行為都正確,但接口不符時(shí),我們應(yīng)該考慮用適配器,目的是使控制范圍之外的一個(gè)原有對(duì)象與某個(gè)接口匹配,適配器模式主要應(yīng)用于希望復(fù)用一些現(xiàn)存的類(lèi),但是接口又與復(fù)用環(huán)境要求不一致的情況。

在 GoF 的設(shè)汁模式中,對(duì)適配器模式講了兩種類(lèi)型,類(lèi)適配器模式和對(duì)象適配器模式,由于類(lèi)適配器模式通過(guò)多重繼承對(duì)一個(gè)接口與另一個(gè)接口進(jìn)行匹配,而JAVA語(yǔ)言不支持多重繼承,也就是一個(gè)類(lèi)只有一個(gè)父類(lèi),所以我們這里主要講的是對(duì)象適配器。

Target(這是客戶(hù)所期待的接口。目標(biāo)可以是具體的或抽象的類(lèi),也可以是接口)代碼如下:

public class Target {
 public void request() {
 System.out.println("普通請(qǐng)求");
 }
}

Adaptee(需要適配的類(lèi))代碼如下:

public class Adaptee {
 public void specialRequest(){
 System.out.println("特殊請(qǐng)求");
 }
}

Adapter(通過(guò)在內(nèi)部包裝一個(gè)Adaptee對(duì)象,把原接口轉(zhuǎn)換成目標(biāo)接口)代碼如下:

public class Adapter extends Target{
 private Adaptee adaptee = new Adaptee();//建立一個(gè)私有的Adaptee對(duì)象
 
 @Override
 public void request() {
 //這樣就可以把表面上調(diào)用request()方法變成實(shí)際調(diào)用的specialRequest()
 adaptee.specialRequest();
 }
}

測(cè)試方法

public class Test {
 public static void main(String[] args) {
     //對(duì)main方法來(lái)說(shuō),調(diào)用的就是Target的request() 
     Target target = new Target();
 target.request();
 }
}

看起來(lái)是不是很簡(jiǎn)單,是不是跟一句俗語(yǔ)很像“掛羊頭賣(mài)狗肉”。

何時(shí)使用適配器模式?

在想使用一個(gè)已經(jīng)存在的類(lèi),但如果它的接口,也就是它的方法和你的要求不相同時(shí),就應(yīng)該考慮用適配器模式。兩個(gè)類(lèi)所做的事情相同或相似,但是具有不同的接口時(shí)要使用它。而且由于類(lèi)都共亨同一個(gè)接口,代碼可以統(tǒng)一調(diào)用同一接口就行了,這樣應(yīng)該可以更簡(jiǎn)單、更直接、更緊湊。

其實(shí)用適配器模式也是無(wú)奈之舉,很有點(diǎn)‘亡羊補(bǔ)牢'的感覺(jué),沒(méi)辦法呀,是軟件就有維護(hù)的一天,維護(hù)就有可能會(huì)因不同的開(kāi)發(fā)人員、不同的產(chǎn)品、不同的廠家而造成功能類(lèi)似而接口不同的情況,此時(shí)就是適配器模式大展拳腳的時(shí)候了。

現(xiàn)在把教練給球員們分配任務(wù)的例子用適配器模式實(shí)現(xiàn)

球員類(lèi)

public abstract class Player {
 protected String name;
 public Player(String name) {
 this.name = name;
 }
 //進(jìn)攻和防守方法
 public abstract void attack();
 public abstract void defense();
}

后衛(wèi)、中鋒、前鋒類(lèi)

//前鋒
public class Forwards extends Player {
 public Forwards(String name) {
 super(name);
 }
 @Override
 public void attack() {
 System.out.println("前鋒:"+name+"進(jìn)攻");
 }
 @Override
 public void defense() {
 // TODO Auto-generated method stub
 System.out.println("前鋒:"+name+"防守");
 }
}
//中鋒
public class Center extends Player {
 public Center(String name) {
 super(name);
 }
 @Override
 public void attack() {
 System.out.println("中鋒:"+name+"進(jìn)攻");
 }

 @Override
 public void defense() {
 // TODO Auto-generated method stub
 System.out.println("中鋒:"+name+"防守");
 }
}
//后衛(wèi)
public class Guards extends Player {
 public Guards(String name) {
 super(name);
 }
 @Override
 public void attack() {
 System.out.println("后衛(wèi):"+name+"進(jìn)攻");
 }
 @Override
 public void defense() {
 // TODO Auto-generated method stub
 System.out.println("后衛(wèi):"+name+"防守");
 }
}

測(cè)試方法

public class Test {
 public static void main(String[] args) {
 Player peter = new Forwards("peter");
 peter.attack();
 Player mike = new Guards("mike");
 mike.attack();
 
 Player zhangsan = new Center("張三");
 zhangsan.attack();
 zhangsan.defense();
 }
}

輸出結(jié)果:

前鋒:peter進(jìn)攻
后衛(wèi):mike進(jìn)攻
中鋒:張三進(jìn)攻
中鋒:張三防守

球員“張三”不會(huì)說(shuō)英語(yǔ),需要翻譯,用適配器模式完善代碼

//外籍中鋒
public class ForeignCenter {
 private String name;
 //外籍中鋒只懂得中文“進(jìn)攻”
 public void jingong() {
 System.out.println("中鋒:"+name+"進(jìn)攻");
 }
 //外籍中鋒只懂得中文“防守”
 public void fangshou() {
 System.out.println("中鋒:"+name+"防守");
 }

 //省略getter、setter方法
}
//翻譯者
public class Translator extends Player {
 //聲明并實(shí)例化一個(gè)內(nèi)部“外籍中鋒”對(duì)象,表面翻譯者與外籍球員有關(guān)聯(lián)
 private ForeignCenter wjzf = new ForeignCenter();
 
 public Translator(String name) {
 super(name);
 wjzf.setName(name);
 }
 
 @Override
 public void attack() {
 //翻譯者將attack翻譯為jingong 告訴外籍中鋒
 wjzf.jingong();
 }

 @Override
 public void defense() {
 //翻譯者將defense翻譯為fangshou 告訴外籍中鋒
 wjzf.fangshou();
 }
}

main方法修改代碼如下:

//翻譯者
public class Translator extends Player {
 //聲明并實(shí)例化一個(gè)內(nèi)部“外籍中鋒”對(duì)象,表面翻譯者與外籍球員有關(guān)聯(lián)
 private ForeignCenter wjzf = new ForeignCenter();
 
 public Translator(String name) {
  super(name);
  wjzf.setName(name);
 }
 
 @Override
 public void attack() {
  //翻譯者將attack翻譯為jingong 告訴外籍中鋒
  wjzf.jingong();
 }

 @Override
 public void defense() {
  //翻譯者將defense翻譯為fangshou 告訴外籍中鋒
  wjzf.fangshou();
 }
}

現(xiàn)在就算是張三不懂英文,教練不懂中文,但因?yàn)橛辛朔g者,團(tuán)隊(duì)溝通合作成為了可能。

如果能事先預(yù)防接口不同的問(wèn)題,不匹配問(wèn)題就不會(huì)發(fā)生:在有小的接口不統(tǒng)一問(wèn)題發(fā)生時(shí),及時(shí)重構(gòu),問(wèn)題不至于擴(kuò)大:只有碰到無(wú)法改變?cè)性O(shè)計(jì)和代碼的情況時(shí),才考慮適配。

事后控制不如事中控制,事中控制不如事前控制。

以上就是實(shí)例講解JAVA 適配器模式的詳細(xì)內(nèi)容,更多關(guān)于JAVA 適配器模式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)戰(zhàn)花店商城系統(tǒng)的實(shí)現(xiàn)流程

    Java實(shí)戰(zhàn)花店商城系統(tǒng)的實(shí)現(xiàn)流程

    只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+Springboot+Maven+mybatis+Vue+Mysql實(shí)現(xiàn)一個(gè)花店商城系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2022-01-01
  • Java中ArrayList類(lèi)的用法與源碼完全解析

    Java中ArrayList類(lèi)的用法與源碼完全解析

    這篇文章主要介紹了Java中ArrayList類(lèi)的用法與源碼完全解析,ArrayList類(lèi)通過(guò)List接口實(shí)現(xiàn),是Java中引申出的一種數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下
    2016-05-05
  • 基于SpringBoot bootstrap.yml配置未生效的解決

    基于SpringBoot bootstrap.yml配置未生效的解決

    這篇文章主要介紹了基于SpringBoot bootstrap.yml配置未生效的解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-10-10
  • java必學(xué)必會(huì)之線程(1)

    java必學(xué)必會(huì)之線程(1)

    java必學(xué)必會(huì)之線程第一篇,介紹了線程的基本概念、線程的創(chuàng)建和啟動(dòng),想要學(xué)好java線程的朋友一定要好好閱讀這篇文章
    2015-12-12
  • springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表的示例代碼

    springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表的示例代碼

    本文主要介紹了springboot+mybatis-plus基于攔截器實(shí)現(xiàn)分表,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Mybatis分解式查詢(xún)使用方法

    Mybatis分解式查詢(xún)使用方法

    這篇文章主要介紹了Mybatis分解式查詢(xún)使用方法,分解式查詢(xún)就是將一條Sql語(yǔ)句拆分成多條。在 MyBatis 多表查詢(xún)中,使用連接查詢(xún)時(shí)一個(gè) Sql 語(yǔ)句就可以查詢(xún)出所有的數(shù)據(jù)
    2023-04-04
  • JAVA二叉樹(shù)的基本操作

    JAVA二叉樹(shù)的基本操作

    這篇文章主要介紹了JAVA二叉樹(shù)的基本操作DEMO,想要詳情了解的小伙伴請(qǐng)接著看下文吧
    2021-08-08
  • springmvc之獲取參數(shù)的方法(必看)

    springmvc之獲取參數(shù)的方法(必看)

    下面小編就為大家?guī)?lái)一篇springmvc之獲取參數(shù)的方法(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 淺談Spring解決jar包依賴(lài)的bom

    淺談Spring解決jar包依賴(lài)的bom

    這篇文章主要介紹了淺談Spring解決jar包依賴(lài)的bom,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2017-12-12
  • @MapperScan注解與@Mapper注解的使用

    @MapperScan注解與@Mapper注解的使用

    這篇文章主要介紹了@MapperScan注解與@Mapper注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論