午夜剧场伦理_日本一道高清_国产又黄又硬_91黄色网战_女同久久另类69精品国产_妹妹的朋友在线

您的位置:首頁技術(shù)文章
文章詳情頁

實例講解JAVA 適配器模式

瀏覽:10日期:2022-08-30 13:13:13

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

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

1、球員學會英語。2、教練學會中文。3、請個翻譯。

1和2是長久之計,但不能解決迫在眉睫的問題。請個翻譯是短暫的更好的選擇。

放在軟件設(shè)計層面上,這就叫做適配器模式。https://www.jb51.net/article/189484.htm

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

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

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

Target(這是客戶所期待的接口。目標可以是具體的或抽象的類,也可以是接口)代碼如下:

public class Target { public void request() { System.out.println('普通請求'); }}

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

public class Adaptee { public void specialRequest(){ System.out.println('特殊請求'); }}

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

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

測試方法

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

看起來是不是很簡單,是不是跟一句俗語很像“掛羊頭賣狗肉”。

何時使用適配器模式?

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

其實用適配器模式也是無奈之舉,很有點‘亡羊補牢’的感覺,沒辦法呀,是軟件就有維護的一天,維護就有可能會因不同的開發(fā)人員、不同的產(chǎn)品、不同的廠家而造成功能類似而接口不同的情況,此時就是適配器模式大展拳腳的時候了。

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

球員類

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

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

//前鋒public class Forwards extends Player { public Forwards(String name) { super(name); } @Override public void attack() { System.out.println('前鋒:'+name+'進攻'); } @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+'進攻'); } @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+'進攻'); } @Override public void defense() { // TODO Auto-generated method stub System.out.println('后衛(wèi):'+name+'防守'); }}

測試方法

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進攻后衛(wèi):mike進攻中鋒:張三進攻中鋒:張三防守

球員“張三”不會說英語,需要翻譯,用適配器模式完善代碼

//外籍中鋒public class ForeignCenter { private String name; //外籍中鋒只懂得中文“進攻” public void jingong() { System.out.println('中鋒:'+name+'進攻'); } //外籍中鋒只懂得中文“防守” public void fangshou() { System.out.println('中鋒:'+name+'防守'); } //省略getter、setter方法}

//翻譯者public class Translator extends Player { //聲明并實例化一個內(nèi)部“外籍中鋒”對象,表面翻譯者與外籍球員有關(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 { //聲明并實例化一個內(nèi)部“外籍中鋒”對象,表面翻譯者與外籍球員有關(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ù)防接口不同的問題,不匹配問題就不會發(fā)生:在有小的接口不統(tǒng)一問題發(fā)生時,及時重構(gòu),問題不至于擴大:只有碰到無法改變原有設(shè)計和代碼的情況時,才考慮適配。

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

以上就是實例講解JAVA 適配器模式的詳細內(nèi)容,更多關(guān)于JAVA 適配器模式的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
主站蜘蛛池模板: 69堂精品| 日韩av片在线免费观看 | 日韩一区二区在线观看视频 | 人人干av| 青青av在线 | 免费视频99 | 制服.丝袜.亚洲.中文.综合懂色 | 91免费看黄| 久久久精品久久久 | 免费看一级 | 中文字幕导航 | 美女福利视频在线观看 | 金瓶狂野欧美性猛交xxxx | 欧美视频国产 | 人人人超碰 | 一起操在线 | 国产成人精品一区二区三区在线 | 国产天堂网 | 男人操女人的视频网站 | 成人动漫中文字幕 | 天天操天天摸天天干 | 欧美成人免费一级人片100 | 中文字幕日本视频 | 91香蕉国产在线观看软件 | 日韩一区二区在线播放 | 久久国产一区二区 | 玖玖成人 | 精品国产乱码久久久久 | 欧美成人精品一区二区 | 久久综合久色欧美综合狠狠 | 久久视频99 | 日韩插插插 | 91免费进入| 日本道中文字幕 | 在线国产小视频 | 综合成人 | 欧美xxxx83d | 欧美午夜一区 | 国产一级视频 | 欧美一区二区三区免费看 | 黄色国产视频网站 |