今天洪爵想和大家一起学习访问者模式,学习完这篇文章,或许你就知道该如何去合理的访问你想要访问的人、事、物了。
设计模式一共有三种模式,第一种创建型模式,第二种行为型模式,最后一种结构型模式。
那么访问者模式属于哪一种类型呢?我们先来简单介绍下访问者模式。听完你或许就知道它到底属于哪一种模式。
访问者模式,顾名思义,提供一种数据结构与数据操作分离开的模式。实现数据结构和操作的解耦。当我们需要对一个对象进行很多不相关的操作,但不想让这些操作“污染”到这些对象时,提供一个访问者对象来封装这些操作。
访问者模式通过在被访问类中添加一个对外提供接待访问的接口来实现。
生活中,其实有很多常见的例子,比如说,你想要到字节,百度,阿里,腾讯等公司去参观下,那么其实你本身不能去污染到整个公司类,你是一个单独的个体,并且你也没有权限能走完整个公司,因为会有相应接待你的人,按照访问的流程来控制你到底能去哪些地方参观。
访问者模式符合单一职责原则,拥有优秀的拓展性,可维护性。
看到这里,你想必已经知道访问者模式属于三大模式中的哪一种了吧?是的,它属于行为型模式的一种,行为型模式旨在关注对象之间的通信。
类图:
具体代码实现:
// 公司抽象类
public abstract class Company {
// 公司名
protected String name;
// 接受访问
public abstract void accept(Visitor visitor);
}
// 访问者接口
public interface Visitor {
public void visit(Company company);
}
// 阿里巴巴
public class Alibaba extends Company {
public Alibaba() {
this.name = "Alibaba";
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 腾讯
public class TenCent extends Company {
public TenCent() {
this.name = "TenCent";
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 字节跳动
public class ByteDance extends Company {
public ByteDance() {
this.name = "byteDance";
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 具体访问者
public class ConcreteVisitor implements Visitor {
@Override
public void visit(Company company) {
System.out.println("访问 " + company.name + " 了");
}
}
public class Client {
public static void main(String[] args) {
Alibaba alibaba = new Alibaba();
TenCent tenCent = new TenCent();
ByteDance byteDance = new ByteDance();
ConcreteVisitor concreteVisitor = new ConcreteVisitor();
alibaba.accept(concreteVisitor);
tenCent.accept(concreteVisitor);
byteDance.accept(concreteVisitor);
}
}
/*
访问 Alibaba 了
访问 TenCent 了
访问 byteDance 了
*/
好啦!本章节就到这里了,希望你已经知道怎么合理、合法、合时的去见你想见的人了!
愿每个人都能带着怀疑的态度去阅读文章并探究其中原理。
道阻且长,往事作序,来日为章。
期待我们下一次相遇!