1. 程式人生 > 其它 >「SequoiaDB巨杉資料庫」addGroups()概述2

「SequoiaDB巨杉資料庫」addGroups()概述2

技術標籤:學習資料設計模式

設計模式

本系列文章均是博主原創,意在記錄學習上的知識,同時一起分享學習心得。

24種設計模式


文章目錄


前言

本章介紹訪問者模式的原理和實現。


一、原理

訪問者模式的描述是允許一個或者多個操作應用到一組物件上,解耦操作和物件本身。
一般來說,訪問者模式針對的是一組型別不同的物件,不過,儘管這組物件的型別是不同的,但是它們繼承相同的父類或者實現相同的介面。在不同的應用場景下,我們需要對這組物件進行一系列不相干的業務操作,但為了避免不斷新增功能導致類不對膨脹,職責越來越不單一,以及避免頻繁地新增功能導致的頻繁程式碼修改,我們使用訪問者模式,將物件與操作解耦,將這些業務操作抽離出來,定義在獨立細分的訪問者類中。

二、實現方式

程式碼如下(示例):

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網路請求的資料。


總結

對於訪問者模式,學習的主要難點在程式碼實現。而程式碼實現比較複雜的主要原因是,函式過載大部分面向物件程式語言是靜態繫結的。也就是說,呼叫類的哪個過載函式,是在編譯期間,由引數的宣告型別決定的,而非執行時,根據引數的實際型別決定的。