題目——橋接模式(抽象調用實現部分)
package org.example.橋接模式;/*** 橋接模式的核心思想是將抽象部分與它的實現部分分離,使它們可以獨立變化,就是說你在實現部分:WinImp、LinuxImp基礎上還能加上RedHatImp,抽象部分:JpegImage、BmpImage、GifImage的基礎上還能加上JpgImage。* Image 是抽象部分,Implementor 是實現部分。這是因為 Image 類擁有對 Implementor 的引用,并通過這個引用調用 Implementor 的方法。在橋接模式中,抽象部分(Image)依賴于實現部分(Implementor)。* Image 類的 parseFile 方法:這個方法通過調用 imp.doPaint(new Matrix()) 完成圖像文件的解析操作。關鍵在于,它使用了一個 Implementor 對象 imp,但具體的實現是由 Image 的子類來決定的。** @author lst* @date 2023年12月07日 14:30*/
class Matrix {
}abstract class Implementor {(1)
}class WinImp extends Implementor {public void doPaint(Matrix m) {}
}class LinuxImp extends Implementor {public void doPaint(Matrix m) {}
}abstract class Image {public void setImp(Implementor imp) {this.imp = imp;}public abstract void parseFile(String fileName);//用于保存實現部分的對象protected Implementor imp;
}class BMPImage extends Image {//完成對圖像文件的解析操作,而 imp 的具體實現是由 Image 的子類決定的@Overridepublic void parseFile(String fileName) {(2)}
}class GIFImage extends Image {@Overridepublic void parseFile(String fileName) {}
}class JPEGImage extends Image {@Overridepublic void parseFile(String fileName) {}
}class Main {public static void main(String[] args) {//Linux上查看demo.gif圖像文件Image image = (3);Implementor imageImpl = (4);(5)image.parseFile("demo.gif");}
}
答案
(1)public abstract void doPaint(Matrix m);
(2)this.imp.doPaint(new Matrix());
(3)new GIFImage()
(4)new LinuxImp()
(5)image.setImp(imageImpl);
解析
這段代碼是在使用橋接模式,目的是讓不同的圖像文件在不同的操作系統上顯示。
先介紹幾個主要的類:
Implementor 類(實現者類):這個類定義了一個操作 doPaint,但不指定具體的實現。有兩個具體的子類,分別是 WinImp 和 LinuxImp,它們分別代表在 Windows 和 Linux 操作系統上的實際圖像操作。
Matrix 類:這個類可能用于表示圖像矩陣,但在這個例子中沒有被用到,可能是作者為了演示橋接模式而故意加上去的。
Image 類:這是另一個抽象類,代表圖像。有三個具體的子類 BMPImage、GIFImage、JPEGImage,它們分別表示不同格式的圖像。Image 類中有一個成員變量 imp,它的類型是 Implementor,用來執行具體的圖像操作。
關鍵的點在于 Image 類的 parseFile 方法。這個方法調用 imp.doPaint(new Matrix()) 來執行圖像的解析和顯示操作。這個方法在 Image 的子類中被具體實現,不同的子類可以指定不同的 imp,從而在不同的操作系統上顯示圖像。
在 Main 類中,演示了如何創建一個 GIFImage 對象,然后設置它的實現者(imp)為 LinuxImp,最后解析 “demo.gif” 圖像文件。這就是橋接模式的應用。