package yanbober.github.io;
import java.util.ArrayList;
import java.util.List;
//Vistor(抽象访问者)
interface Vistor {
void visit(ConcreteElementNodeA node);
void visit(ConcreteElementNodeB node);
}
//ConcreteVisitor(具体访问者)
class ConcreteVisitorA implements Vistor {
@Override
public void visit(ConcreteElementNodeA node) {
System.out.println(node.operationA());
}
@Override
public void visit(ConcreteElementNodeB node) {
System.out.println(node.operationB());
}
}
class ConcreteVisitorB implements Vistor {
@Override
public void visit(ConcreteElementNodeA node) {
System.out.println(node.operationA());
}
@Override
public void visit(ConcreteElementNodeB node) {
System.out.println(node.operationB());
}
}
//Element(抽象元素)
abstract class ElementNode {
public abstract void accept(Vistor vistor);
}
//ConcreteElement(具体元素)
class ConcreteElementNodeA extends ElementNode {
@Override
public void accept(Vistor vistor) {
vistor.visit(this);
}
public String operationA() {
return “ConcreteElementNodeA”;
}
}
class ConcreteElementNodeB extends ElementNode {
@Override
public void accept(Vistor vistor) {
vistor.visit(this);
}
public String operationB() {
return “ConcreteElementNodeB”;
}
}
//ObjectStructure(对象结构)
class ObjectStructure {
private List nodeList = new ArrayList<>();
public void action(Vistor vistor) {
for (ElementNode node : nodeList) {
node.accept(vistor);
}
}
public void add(ElementNode node) {
nodeList.add(node);
}
}
//客户端
public class Main {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(new ConcreteElementNodeA());
objectStructure.add(new ConcreteElementNodeB());
Vistor vistor = new ConcreteVisitorA();
objectStructure.action(vistor);
}
}
总结一把
访问者模式优点:
增加新的访问操作很方便。使用访问者模式,增加新的访问操作就意味着增加一个新的具体访问者类,实现简单,无须修改源代码,符合“开闭原则”。
将有关元素对象的访问行为集中到一个访问者对象中,而不是分散在一个个的元素类中。类的职责更加清晰,有利于对象结构中元素对象的复用,相同的对象结构可以供多个不同的访问者访问。
让用户能够在不修改现有元素类层次结构的情况下,定义作用于该层次结构的操作。
访问者模式缺点:
增加新的元素类很困难。在访问者模式中,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”的要求。
破坏封装。访问者模式要求访问者对象访问并调用每一个元素对象的操作,这意味着元素对象有时候必须暴露一些自己的内部操作和内部状态,否则无法供访问者访问。
【工匠若水 http://blog.csdn.net/yanbober】 继续阅读《设计模式(行为型)之解释器模式(Interpreter Pattern)》 http://blog.csdn.net/yanbober/article/details/45537601
最后
这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
相信它会给大家带来很多收获:
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。
- 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
- 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。
当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!