今天我探討一下適配器模式和橋接模式,這兩種模式往往容易被混淆,我們希望通過比較他們的區(qū)別和聯(lián)系,能夠讓大家有更清晰的認(rèn)識。
適配器模式:連接不兼容接口
當(dāng)你有一個類的接口不兼容你的系統(tǒng),而你又不希望修改這個類的源代碼時,適配器模式就能派上用場。適配器模式作用在已有組件的接口層面,使之能夠滿足客戶端的期望接口。
例如,你有一臺彩色打印機,但是你的圖形處理系統(tǒng)只支持黑白打印機:
// 你的圖形處理系統(tǒng)只能接受這個接口
interface BlackWhitePrinter {
void printBlackWhite();
}
// 但是你有的是彩色打印機:
class ColorPrinter {
void printColor() {
System.out.println("Printing Color");
}
}
// 適配器模式就派上用場了
class PrinterAdapter implements BlackWhitePrinter {
private final ColorPrinter colorPrinter;
public PrinterAdapter(ColorPrinter colorPrinter) {
this.colorPrinter = colorPrinter;
}
@Override
public void printBlackWhite() {
colorPrinter.printColor();
}
}
橋接模式:劃分接口和實現(xiàn)
橋接模式通過將抽象和實現(xiàn)解耦,使得兩者可以獨立進行變化。它的主要目標(biāo)是避免當(dāng)修改實現(xiàn)時,需要同時修改接口。
比如我們有一個圖形API,定義有多種形狀,比如矩形、圓形等。同時,每種形狀都可能有多種繪制方式,比如OpenGL、Vulkan。如果不采用橋接模式,很可能會出現(xiàn)類名如OpenGLRectangle, OpenGLCircle, VulkanRectangle, VulkanCircle…這顯然是一種不好的設(shè)計,因為每次添加或修改一個圖形類型或繪制方式,都會影響另一方。
而相反,通過橋接模式,我們可以把Shape和DrawAPI解耦:
interface DrawAPI { // 抽象接口
void draw();
}
class Shape {
protected DrawAPI api;
public Shape(DrawAPI api) {
this.api = api;
}
public void draw() {
api.draw(); // 調(diào)用實現(xiàn)
}
}
class OpenGL implements DrawAPI {
@Override
public void draw() {
System.out.println("OpenGL drawing");
}
}
class Vulkan implements DrawAPI {
@Override
public void draw() {
System.out.println("Vulkan drawing");
}
}
這樣我們就可以任意組合Shape和DrawAPI:
Shape openglShape = new Shape(new OpenGL());
Shape vulkanShape = new Shape(new Vulkan());
兩者的區(qū)別和聯(lián)系
雖然適配器模式和橋接模式在表面上有諸多相似之處,比如他們都試圖使得兩個或以上的類或接口能夠協(xié)同工作,但是他們的應(yīng)用場景和目標(biāo)是不一樣的。
適配器模式關(guān)注的是如何使已有組件能夠適應(yīng)你的接口以達(dá)到代碼重用,它解決的是“已經(jīng)存在”的問題。
而橋接模式關(guān)注的是如何設(shè)計你的抽象和實現(xiàn),使其能夠獨立變化,它解決的是“尚未發(fā)生”的問題。
更進一步的講:文章來源:http://www.zghlxwxcb.cn/news/detail-822474.html
- 適配器模式:適配器模式的主要目標(biāo)是讓原本接口不兼容的兩個接口可以協(xié)同工作。它通常被用在已經(jīng)存在的系統(tǒng)中,以解決現(xiàn)有組件與系統(tǒng)其他部分的兼容性問題。通常情況下,適配器會封裝已經(jīng)存在的組件,并提供一個與系統(tǒng)其余部分兼容的接口。
- 橋接模式:橋接模式的主要目標(biāo)在于將抽象與實現(xiàn)解耦,使得兩者可以獨立地變化。這種解耦使得抽象和實例化可以沿著各自的軸線變化,也就是說,抽象層次結(jié)構(gòu)的改變不會影響到實例化層次結(jié)構(gòu)的改變,反之亦然。
希望這篇文章能夠幫助你理解適配器模式和橋接模式,以及他們的區(qū)別和聯(lián)系。學(xué)習(xí)設(shè)計模式是一個長期的過程,不要著急,慢慢積累,總會有收獲的。文章來源地址http://www.zghlxwxcb.cn/news/detail-822474.html
到了這里,關(guān)于【設(shè)計模式】適配器和橋接器模式有什么區(qū)別?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!