Go和Java实现访问者模式

这篇具有很好参考价值的文章主要介绍了Go和Java实现访问者模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go和Java实现访问者模式

我们下面通过一个解压和压缩各种类型的文件的案例来说明访问者模式的使用。

1、访问者模式

在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随

着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者

对象就可以处理元素对象上的操作。

  • 意图:主要将数据结构与数据操作分离。

  • 主要解决:稳定的数据结构和易变的操作耦合问题。

  • 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这

    些对象的类,使用访问者模式将这些封装到类中。

  • 如何解决:在被访问的类里面加一个对外提供接待访问者的接口。

  • 关键代码:在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。

  • 应用实例:您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一

    个判断,这就是访问者模式。

  • 优点:1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。

  • 缺点:1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒

    置原则,依赖了具体类,没有依赖抽象。

  • 使用场景:1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一

    个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希

    望在增加新操作时修改这些类。

  • 注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。

  • 适用性:

    一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。

    需要对一个对象结构中的对象进行很多不同的并且不相关的操作,让你想避免让这些操作污染这些对象的类。

    Visitor使得你可以将相关的操作集中起来定义在一个类中,当该对象结构被很多应用共享时,用Visitor模

    式让每个应用仅包含需要用到的操作。

    定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者

    的接口,这可能想要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。文章来源地址https://www.toymoban.com/news/detail-635519.html

2、Go实现访问者模式

package visitor

// ========== 访问者FileUseVisitor ==========
type FileUseVisitor interface {

	// 为每一个类声明一个visit操作
	visitPdfFile(FileResourceVisitable)

	visitPPTFile(FileResourceVisitable)

	visitTextFile(FileResourceVisitable)
}
package visitor

import "fmt"

// ========== 访问者Compress ==========
type Compress struct {
}

func (compress *Compress) visitPdfFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Compress file: " + fileResourceVisitable.(*PdfFile).Path)
}

func (compress *Compress) visitPPTFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Compress file: " + fileResourceVisitable.(*PPTFile).Path)
}

func (compress *Compress) visitTextFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Compress file: " + fileResourceVisitable.(*TextFile).Path)
}
package visitor

import "fmt"

// ========== 访问者Decompress ==========
type Decompress struct {
}

func (decompress *Decompress) visitPdfFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Decompress file: " + fileResourceVisitable.(*PdfFile).Path)
}

func (decompress *Decompress) visitPPTFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Decompress file: " + fileResourceVisitable.(*PPTFile).Path)
}

func (decompress *Decompress) visitTextFile(fileResourceVisitable FileResourceVisitable) {
	fmt.Println("Decompress file: " + fileResourceVisitable.(*TextFile).Path)
}
package visitor

// ========== 接收者FileResourceVisitable ==========
type FileResourceVisitable interface {
	accept(FileUseVisitor)
}
package visitor

// ========== 接收者PdfFile ==========
type PdfFile struct {
	Path string
}

func (pdfFile *PdfFile) accept(fileUseVisitor FileUseVisitor) {
	fileUseVisitor.visitPdfFile(pdfFile)
}
package visitor

// ========== 接收者PPTFile ==========
type PPTFile struct {
	Path string
}

func (pPTFile *PPTFile) accept(fileUseVisitor FileUseVisitor) {
	fileUseVisitor.visitPPTFile(pPTFile)
}
package visitor

// ========== 接收者TextFile ==========
type TextFile struct {
	Path string
}

func (textFile *TextFile) accept(fileUseVisitor FileUseVisitor) {
	fileUseVisitor.visitTextFile(textFile)
}
package visitor

// ========== FileStructure ==========
type FileStructure struct {
	fileResourceVisitableList []FileResourceVisitable
}

func (fileStructure *FileStructure) Attach(fileResourceVisitable FileResourceVisitable) {
	fileStructure.fileResourceVisitableList = append(fileStructure.fileResourceVisitableList, fileResourceVisitable)
}

func (fileStructure *FileStructure) Detach(fileResourceVisitable FileResourceVisitable) {
	for i := 0; i < len(fileStructure.fileResourceVisitableList); i++ {
		if fileStructure.fileResourceVisitableList[i] == fileResourceVisitable {
			fileStructure.fileResourceVisitableList = append(fileStructure.fileResourceVisitableList[:i], fileStructure.fileResourceVisitableList[i+1:]...)
		}
	}
}

func (fileStructure *FileStructure) Accept(fileUseVisitor FileUseVisitor) {
	for _, fileResourceVisitable := range fileStructure.fileResourceVisitableList {
		fileResourceVisitable.accept(fileUseVisitor)
	}
}
package main

import . "proj/visitor"

func main() {
	fileStructure := FileStructure{}
	fileStructure.Attach(&PPTFile{Path: "test.ppt"})
	fileStructure.Attach(&PdfFile{Path: "test.pdf"})
	fileStructure.Attach(&TextFile{Path: "test.txt"})
	fileStructure.Accept(&Decompress{})
	fileStructure.Accept(&Compress{})
}
# 输出
Decompress file: test.ppt
Decompress file: test.pdf
Decompress file: test.txt
Compress file: test.ppt
Compress file: test.pdf
Compress file: test.txt

3、Java实现访问者模式

package com.visitor;

// ========== 访问者FileUseVisitor ==========
public interface FileUseVisitor {

    // 为每一个类声明一个visit操作
    void visitPdfFile(FileResourceVisitable fileResourceVisitable);

    void visitPPTFile(FileResourceVisitable fileResourceVisitable);

    void visitTextFile(FileResourceVisitable fileResourceVisitable);
}
package com.visitor;

// ========== 访问者Compress ==========
public class Compress implements FileUseVisitor{

    @Override
    public void visitPdfFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Compress file: "+fileResourceVisitable.path);
    }

    @Override
    public void visitPPTFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Compress file: "+fileResourceVisitable.path);
    }

    @Override
    public void visitTextFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Compress file: "+fileResourceVisitable.path);
    }
}
package com.visitor;

// ========== 访问者Decompress ==========
public class Decompress implements FileUseVisitor{

    @Override
    public void visitPdfFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Decompress file: "+fileResourceVisitable.path);
    }

    @Override
    public void visitPPTFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Decompress file: "+fileResourceVisitable.path);
    }

    @Override
    public void visitTextFile(FileResourceVisitable fileResourceVisitable) {
        System.out.println("Decompress file: "+fileResourceVisitable.path);
    }
}
package com.visitor;

// ========== 接收者FileResourceVisitable ==========
public abstract class FileResourceVisitable {
    protected String path;
    abstract void accept(FileUseVisitor fileUseVisitor);
}
package com.visitor;

// ========== 接收者PdfFile ==========
public class PdfFile extends FileResourceVisitable {

    public PdfFile(String path){
        this.path = path;
    }

    @Override
    public void accept(FileUseVisitor fileUseVisitor) {
        fileUseVisitor.visitPdfFile(this);
    }
}
package com.visitor;

// ========== 接收者PPTFile ==========
public class PPTFile extends FileResourceVisitable {

    public PPTFile(String path){
        this.path = path;
    }

    @Override
    public void accept(FileUseVisitor fileUseVisitor) {
        fileUseVisitor.visitPPTFile(this);
    }
}

package com.visitor;

// ========== 接收者TextFile ==========
public class TextFile extends FileResourceVisitable {

    public TextFile(String path){
        this.path = path;
    }

    @Override
    public void accept(FileUseVisitor fileUseVisitor) {
        fileUseVisitor.visitTextFile(this);
    }
}
package com.visitor;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

// ========== FileStructure ==========
public class FileStructure {
    List<FileResourceVisitable> fileResourceVisitableList = new ArrayList<>();

    public void attach(FileResourceVisitable fileResourceVisitable){
        fileResourceVisitableList.add(fileResourceVisitable);
    }

    public void detach(FileResourceVisitable fileResourceVisitable){
        Objects.requireNonNull(fileResourceVisitable);
    }

    public void accept(FileUseVisitor fileUseVisitor){
        for(FileResourceVisitable fileResourceVisitable:fileResourceVisitableList){
            fileResourceVisitable.accept(fileUseVisitor);
        }
    }
}
package com.visitor;

public class Test {
    public static void main(String[] args) {
        FileStructure fileStructure = new FileStructure();
        fileStructure.attach(new PPTFile("test.pdf"));
        fileStructure.attach(new PdfFile("test.pdf"));
        fileStructure.attach(new TextFile("test.txt"));
        fileStructure.accept(new Compress());
        fileStructure.accept(new Decompress());
    }
}
# 输出
Compress file: test.pdf
Compress file: test.pdf
Compress file: test.txt
Decompress file: test.pdf
Decompress file: test.pdf
Decompress file: test.txt

到了这里,关于Go和Java实现访问者模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之行为型-访问者模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。 访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就

    2024年02月16日
    浏览(56)
  • Go和Java实现访问者模式

    我们下面通过一个解压和压缩各种类型的文件的案例来说明访问者模式的使用。 在访问者模式中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随 着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对

    2024年02月13日
    浏览(24)
  • 设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

    当谈到访问者模式时,我们可以通过以下方式进行详细解释: 访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者

    2024年02月03日
    浏览(59)
  • 设计模式—访问者模式

     需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 如果此时再添加一个操作:找出新品上市的水果。 上述代码中,FruitMarket为应付新增操作,增加了相应的方法来满足要求,但这样破坏了FruitMarket的结构。 本质是将数据结构和数据操作分

    2024年02月10日
    浏览(60)
  • 设计模式——访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。 元素接口(Element Interface): 定义了一个accept()方法

    2024年01月18日
    浏览(58)
  • 设计模式——19. 访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类(被访问者)的前提下,定义对元素的新操作(访问者),并将这些操作封装到独立的访问者类中。这样,你可以在不修改被访问者的类的情况下,通过不同的访问者来执行不同的操作。 访问者模式

    2024年02月07日
    浏览(43)
  • 设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(41)
  • js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(72)
  • 设计模式之访问者模式(下)

    3)访问者模式与组合模式联用 1.概述 在访问者模式中,包含一个用于存储元素对象集合的对象结构,可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。 2.结构图

    2024年04月25日
    浏览(47)
  • 设计模式(二十三)访问者

    表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式 访问者模式是一种较为复杂的行为型模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素

    2024年02月19日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包