「SequoiaDB巨杉資料庫」addGroups()概述2
阿新 • • 發佈:2021-01-29
設計模式
本系列文章均是博主原創,意在記錄學習上的知識,同時一起分享學習心得。文章目錄
前言
本章介紹訪問者模式的原理和實現。
一、原理
訪問者模式的描述是允許一個或者多個操作應用到一組物件上,解耦操作和物件本身。
一般來說,訪問者模式針對的是一組型別不同的物件,不過,儘管這組物件的型別是不同的,但是它們繼承相同的父類或者實現相同的介面。在不同的應用場景下,我們需要對這組物件進行一系列不相干的業務操作,但為了避免不斷新增功能導致類不對膨脹,職責越來越不單一,以及避免頻繁地新增功能導致的頻繁程式碼修改,我們使用訪問者模式,將物件與操作解耦,將這些業務操作抽離出來,定義在獨立細分的訪問者類中。
二、實現方式
程式碼如下(示例):
public abstract class ResourceFile {
private String filePath;
public ResourceFile(String filePath) {
this.filePath = filePath;
}
abstract public void accept(Visitor visitor);
}
public class PDFFile extends ResourceFile {
public PDFFile(String filePath) {
super(filePath);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class PPTFile extends ResourceFile {
public PPTFile(String filePath) {
super(filePath);
}
@Override
public void accept(Visitor visitor) {
visitor. visit(this);
}
}
public class WordFile extends ResourceFile {
public WordFile(String filePath) {
super(filePath);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public interface Visitor {
void visit(PDFFile file);
void visit(PPTFile file);
void visit(WordFile file);
}
public class Extractor implements Visitor{
@Override
public void visit(PDFFile file) {
System.out.println("解析PDF檔案為txt");
}
@Override
public void visit(PPTFile file) {
System.out.println("解析PPT檔案為txt");
}
@Override
public void visit(WordFile file) {
System.out.println("解析WORD檔案為txt");
}
}
public class Compressor implements Visitor {
@Override
public void visit(PDFFile file) {
System.out.println("壓縮PDF檔案為txt");
}
@Override
public void visit(PPTFile file) {
System.out.println("壓縮PPT檔案為txt");
}
@Override
public void visit(WordFile file) {
System.out.println("壓縮WORD檔案為txt");
}
}
@Test
public void testVisitor() {
Extractor extractor = new Extractor();
Compressor compressor = new Compressor();
List<ResourceFile> files = new ArrayList<>();
files.add(new PPTFile("a.ppt"));
files.add(new PDFFile("a.pdf"));
files.add(new WordFile("a.word"));
for (ResourceFile file : files) {
file.accept(extractor);
file.accept(compressor);
}
}
該處使用的url網路請求的資料。
總結
對於訪問者模式,學習的主要難點在程式碼實現。而程式碼實現比較複雜的主要原因是,函式過載大部分面向物件程式語言是靜態繫結的。也就是說,呼叫類的哪個過載函式,是在編譯期間,由引數的宣告型別決定的,而非執行時,根據引數的實際型別決定的。