访问者模式

设计模式

本系列文章均是博主原创,意在记录学习上的知识,同时一起分享学习心得。

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网络请求的数据。


总结

对于访问者模式,学习的主要难点在代码实现。而代码实现比较复杂的主要原因是,函数重载大部分面向对象编程语言是静态绑定的。也就是说,调用类的哪个重载函数,是在编译期间,由参数的声明类型决定的,而非运行时,根据参数的实际类型决定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值