適配器模式(Adapter Pattern)是一種結構型設計模式,用于將一個類的接口轉換成客戶端期望的另一個接口。這種模式使得原本由于接口不兼容而不能一起工作的類可以一起工作。在本文中,我們將介紹 Java 中適配器模式的定義、結構、使用場景以及如何在實際開發(fā)中應用。
1. 定義
適配器模式是一種結構型設計模式,它允許一個接口轉換成另一個接口。它允許原本由于接口不兼容而不能一起工作的類可以一起工作。適配器模式通常包含三個主要角色:目標接口(Target)、被適配者(Adaptee)、適配器(Adapter)。
- 目標接口(Target): 客戶端期望的接口,適配器將被適配者適配成這個接口
- 被適配者(Adaptee): 需要被適配的類或接口,它與目標接口不兼容
- 適配器(Adapter): 通過實現(xiàn)目標接口并包裝被適配者,使得被適配者的接口能夠被客戶端調用
2. 應用場景
適配器模式通常在以下場景中使用:
-
已有類的接口不符合客戶端的需求:
當一個已有類的接口與客戶端的需求不匹配時,可以使用適配器模式將已有類的接口適配成客戶端期望的接口
-
需要復用多個現(xiàn)有子類的情況:
如果需要復用一個或多個已有類的子類,但是這些子類的接口不符合需要,可以通過適配器模式適配這些子類
-
不希望修改已有類的情況:
如果不希望修改已有類的代碼,但是需要使其與其他類或接口協(xié)同工作,可以使用適配器模式
3. 代碼實現(xiàn)
下面通過一個簡單的例子來演示適配器模式的實現(xiàn)。假設有一個多語言說話器(Speaker
)接口,但是目前只支持說中文?,F(xiàn)在需要在該多語言說話器中集成說外國話,如 英語。這時就可以使用適配器模式。
目標接口 Speaker
package com.cheney.demo;
public interface Speaker {
void speak(String country, String something);
}
被適配者接口 AdvancedSpeaker
package com.cheney.demo;
public interface AdvancedSpeaker {
void speakChinese(String something);
void speakEnglish(String something);
}
具體的被適配者類 ChineseSpeaker
package com.cheney.demo;
public class ChineseSpeaker implements AdvancedSpeaker{
@Override
public void speakChinese(String something) {
System.out.println("[中文] " + something);
}
@Override
public void speakEnglish(String something) {
}
}
具體的被適配者類 EnglishSpeaker
package com.cheney.demo;
public class EnglishSpeaker implements AdvancedSpeaker{
@Override
public void speakChinese(String something) {
}
@Override
public void speakEnglish(String something) {
System.out.println("[英文] " + something);
}
}
適配器類 SpeakerAdapter
package com.cheney.demo;
public class SpeakerAdapter implements Speaker{
private final AdvancedSpeaker advancedSpeaker;
public SpeakerAdapter(String country) {
if (country.equalsIgnoreCase("chinese")) {
advancedSpeaker = new ChineseSpeaker();
} else {
advancedSpeaker = new EnglishSpeaker();
}
}
@Override
public void speak(String country, String something) {
if (country.equalsIgnoreCase("chinese")) {
advancedSpeaker.speakChinese(something);
} else {
advancedSpeaker.speakEnglish(something);
}
}
}
目標類 PeopleSpeaker
package com.cheney.demo;
public class PeopleSpeaker implements Speaker {
@Override
public void speak(String country, String something) {
// 說中文
if (country.equalsIgnoreCase("chinese")) {
System.out.println(something);
} else {
// 使用適配器說外語
SpeakerAdapter speakerAdapter = new SpeakerAdapter(something);
speakerAdapter.speak(country, something);
}
}
}
客戶端啟動類
package com.cheney.demo;
public class Main {
public static void main(String[] args) {
Speaker speaker = new PeopleSpeaker();
speaker.speak("chinese", "你好!");
speaker.speak("english", "Hello!");
}
}
執(zhí)行結果:
在上述例子中,Speaker
是目標接口,AdvancedSpeaker
是被適配者接口。ChineseSpeaker
和 EnglishSpeaker
是具體的被適配者類。SpeakerAdapter
是適配器類,通過實現(xiàn)目標接口并包裝不兼容的被適配者接口,使得客戶端可以通過適配器調用被適配者的功能。PeopleSpeaker
是具體的目標類,負責說話,當說其他國家語言時,通過適配器調用說相應國家的話。
通過適配器模式,我們實現(xiàn)了談話時對其他國家語言的兼容,而不需要修改原有的說話接口和被適配者類。這使得系統(tǒng)更加靈活,能夠方便地擴展和添加新的語言的支持。
結語
適配器模式是一種在面對不同接口的系統(tǒng)集成中非常有用的設計模式。通過適配器,可以使原本不兼容的接口能夠協(xié)同工作,提高了系統(tǒng)的靈活性和可維護性。在實際開發(fā)中,適配器模式常被用于集成第三方庫、系統(tǒng)升級和接口兼容等場景。
【Java 設計模式】系列 《23 種設計模式》 與 《7 大設計原則》 總綱
??設計原則
?單一職責原則(SRP) 規(guī)定一個類應該只有一個引起變化的原因
?開放/封閉原則(OCP) 表明軟件實體應該是可以擴展的,但是不可修改的
?里氏替換原則(LSP) 強調派生類必須能夠替代其基類而不引起程序錯誤
?依賴倒置原則(DIP) 倡導高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象
?接口隔離原則(ISP) 提倡一個類不應該被強迫依賴它不使用的接口
?合成/聚合復用原則(CARP) 建議盡量使用合成/聚合,盡量不要使用繼承
?迪米特法則(LoD) 規(guī)定一個對象應該對其他對象有最少的了解
??創(chuàng)建型設計模式
?單例模式 保證一個類僅有一個實例,并提供一個訪問它的全局點
?工廠方法模式 定義一個用于創(chuàng)建對象的接口,但是由子類決定實例化哪一個類
?抽象工廠模式 提供一個創(chuàng)建一系列相關或相互依賴對象的接口,而無需指定它們具體的類
?建造者模式 將一個復雜對象的構建與其表示分離,使得同樣的構建過程可以創(chuàng)建不同的表示
?原型模式 通過復制現(xiàn)有的對象來創(chuàng)建新對象,而不是從頭開始創(chuàng)建
??結構型設計模式
?適配器模式 將一個類的接口轉換成客戶希望的另外一個接口
?橋接模式 將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化
?組合模式 將對象以樹形結構組合以表示“部分-整體”的層次結構
?裝飾器模式 動態(tài)地給一個對象添加一些額外的職責
?外觀模式 為子系統(tǒng)中的一組接口提供一個一致的界面
?代理模式 為其他對象提供一種代理以控制對這個對象的訪問
?享元模式 用共享的方式高效地支持大量小粒度對象文章來源:http://www.zghlxwxcb.cn/news/detail-805126.html
??行為型設計模式
?觀察者模式 定義對象間的一對多依賴,當一個對象改變狀態(tài),所有依賴者都會受到通知并自動更新
?策略模式 定義一系列算法,將它們封裝起來,并且使它們可以相互替換
?命令模式 將請求封裝成對象,使得可以用不同的請求對客戶進行參數(shù)化
?狀態(tài)模式 允許對象在其內部狀態(tài)改變時改變它的行為
?責任鏈模式 為解除請求的發(fā)送者和接收者之間的耦合,而使多個對象都有機會處理這個請求
?訪問者模式 將算法與對象結構分離,并且可以在不改變對象結構的前提下定義新的操作
?中介者模式 用一個中介對象來封裝一系列的對象交互
?備忘錄模式 在不破壞封裝的情況下,捕獲對象的內部狀態(tài),并在對象之外保存這個狀態(tài)
?迭代器模式 提供一種方法順序訪問一個聚合對象中的各個元素,而不暴露其內部表示
?模版方法模式 定義一個操作中的算法的骨架,將一些步驟延遲到子類中
?解釋器模式 定義一個語言的文法,并且建立一個解釋器來解釋該語言中的句子
文章來源地址http://www.zghlxwxcb.cn/news/detail-805126.html
到了這里,關于【Java 設計模式】結構型之適配器模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!