行为型(七) - 访问者模式

一、概念

访问者模式(Visitor Pattern):我们使用了一个访问者类,改变元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。

优点:把业务操作跟具体的数据结构解耦。

二、实现

我们实现对不同文件的不同操作。
1、文件基类

public abstract class File {
    protected String filePath;

    public File(String filePath){
        this.filePath = filePath;
    }

    abstract public void setVisitor(Visitor visitor);
}

2、文件类

public class TxtFile extends File {
    public TxtFile(String filePath) {
        super(filePath);
    }

    @Override
    public void setVisitor(Visitor visitor) {
        visitor.visit(this);
    }
}

public class WordFile extends File {
    public WordFile(String filePath) {
        super(filePath);
    }

    @Override
    public void setVisitor(Visitor visitor) {
        visitor.visit(this);
    }
}

3、操作类

public interface Visitor {
    void visit(WordFile wordFile);
    void visit(TxtFile txtFile);
}

public class Compressor implements Visitor {
    @Override
    public void visit(TxtFile txtFile) {
        System.out.println("压缩txt");
    }

    @Override
    public void visit(WordFile wordFile) {
        System.out.println("压缩word");
    }
}

public class Copy implements Visitor {
    @Override
    public void visit(TxtFile txtFile) {
        System.out.println("复制txt");
    }

    @Override
    public void visit(WordFile wordFile) {
        System.out.println("复制word");
    }
}

3、测试类

public class Client {
    public static void main(String[] args) {
        TxtFile txtFile = new TxtFile("/root/aaa.txt");
        WordFile wordFile = new WordFile("/root/bbb.doc");
        
        Compressor compressor = new Compressor();
        txtFile.setVisitor(compressor);
        wordFile.setVisitor(compressor);

        Copy copy = new Copy();
        txtFile.setVisitor(copy);
        wordFile.setVisitor(copy);
    }
}

4、运行结果
访问者结果.png

总结:通过上面的例子,在梳理下概念,我们使用了一个访问者类,改变元素类的执行算法。这个访问类就是例子中的Visitor业务操作类。改变元素类的执行算法,来控制对数据结构的操作方式,也就是执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值