訪問者模式(Visitor Pattern)是一種行為型設計模式,它主要用于在不修改現(xiàn)有類結構的前提下向對象結構添加新的操作。訪問者模式通過定義一個訪問者接口,使得可以在不改變元素類的情況下,為各個元素類增加新的功能。文章來源:http://www.zghlxwxcb.cn/news/detail-802508.html
原理
- 元素接口(Element Interface): 定義了一個accept()方法,用于接收訪問者對象的訪問。
- 具體元素類(Concrete Elements): 實現(xiàn)了元素接口,并且每個類都可能有自己特有的業(yè)務邏輯和數(shù)據(jù)。
- 訪問者接口(Visitor Interface): 定義了一系列訪問元素的方法,對應不同的具體元素類型。
- 具體訪問者類(Concrete Visitors): 實現(xiàn)了訪問者接口,提供了對每個具體元素類進行特定操作的方法。
Java代碼示例
// 元素接口
public interface Element {
void accept(Visitor visitor);
}
// 具體元素類 - 文件
public class File implements Element {
private String name;
public File(String name) {
this.name = name;
}
@Override
public void accept(Visitor visitor) {
visitor.visitFile(this);
}
// 獲取文件名
public String getName() {
return name;
}
}
// 具體元素類 - 文件夾
public class Folder implements Element {
private List<Element> children;
public Folder() {
this.children = new ArrayList<>();
}
public void addElement(Element child) {
children.add(child);
}
@Override
public void accept(Visitor visitor) {
visitor.visitFolder(this);
for (Element child : children) {
child.accept(visitor);
}
}
// 獲取子元素列表
public List<Element> getChildren() {
return children;
}
}
// 訪問者接口
public interface Visitor {
void visitFile(File file);
void visitFolder(Folder folder);
}
// 具體訪問者類 - 計算文件總數(shù)與大小
public class SizeCalculator implements Visitor {
private int fileCount;
private long totalSize;
public SizeCalculator() {
fileCount = 0;
totalSize = 0L;
}
@Override
public void visitFile(File file) {
fileCount++;
// 假設我們已有一個獲取文件大小的方法
totalSize += getFileSize(file.getName());
}
@Override
public void visitFolder(Folder folder) {
for (Element element : folder.getChildren()) {
element.accept(this);
}
}
public int getFileCount() {
return fileCount;
}
public long getTotalSize() {
return totalSize;
}
// 示例方法,實際中需要從磁盤或數(shù)據(jù)庫獲取
private long getFileSize(String fileName) {
// 這里僅作演示,實際上會根據(jù)文件名獲取真實大小
return 1024; // 假設每個文件大小為1KB
}
}
// 使用示例
public class Client {
public static void main(String[] args) {
Folder root = new Folder();
root.addElement(new File("file1.txt"));
root.addElement(new File("file2.txt"));
Folder subFolder = new Folder();
subFolder.addElement(new File("subFile1.txt"));
root.addElement(subFolder);
SizeCalculator calculator = new SizeCalculator();
root.accept(calculator);
System.out.println("Total files: " + calculator.getFileCount());
System.out.println("Total size: " + calculator.getTotalSize());
}
}
想象你正在管理一個圖書館,書架上有各種書籍和盒子(代表文件和文件夾)。當你要統(tǒng)計所有書籍的數(shù)量和總體積時,你可以扮演“訪問者”的角色,逐個檢查每本書籍和盒子。打開盒子后,再繼續(xù)檢查盒子里的內容。在這個過程中,你不需要修改書本或盒子本身,而是通過定義一套針對不同對象的操作規(guī)則(訪問者接口),實現(xiàn)了靈活的功能擴展。文章來源地址http://www.zghlxwxcb.cn/news/detail-802508.html
應用場景
- 文件系統(tǒng)遍歷:定義一個訪問者來統(tǒng)計文件夾中的文件數(shù)量、計算總大小等。
- 編譯器語法分析:遍歷抽象語法樹(AST),對不同類型的節(jié)點執(zhí)行不同的處理,如類型檢查、代碼生成等。
適用性
- 對象結構穩(wěn)定但需要頻繁增加新的操作。
- 需要對一組相似的對象結構執(zhí)行不同的操作。
- 想要在不影響這些對象的情況下定義新操作。
到了這里,關于設計模式——訪問者模式的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!