Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式

简介: Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式

【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】

知识回顾:
>

之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)---行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)---行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)---行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)---行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)---行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)---行为型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】。

访问者模式

访问者模式:使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。
通俗来说就是:不同的人对同一件事情有着不同的处理方式。

解决的问题

  1. 主要将数据结构与数据操作分离。
  2. 稳定的数据结构和易变的操作耦合问题。

生产开发中常用的使用场景

  1. XML文档解析器设计。
  2. 编译器的设计。
  3. 复杂集合对象的处理。
  4. (应用范围非常窄,了解即可)

访问者模式优点与缺点

优点

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

缺点

  1. 具体元素对访问者公布细节,违反了迪米特原则。
  2. 具体元素变更比较困难。
  3. 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。

核心角色

Visitor接口:定义了某个状态下所有Element接口中具体实现类对应的执行规则
ConcreteVisitor1具体类:实现了Visitor接口,自己具体实现内容
ConcreteVisitor2具体类:实现了Visitor接口,自己具体实现内容
Element接口:定义了处理事情或者是执行方法的规则
ConcreteElementA具体类:实现了Element接口,实现了自己的内容
ConcreteElementB具体类:实现了Element接口,实现了自己的内容
ObjectStructure类:Element元素的数据集合,添加,删除,执行展示方法等等。。

UML类图

image.png

实现代码

我们实现这样一个栗子:

成功的男人后面有一个贤惠的女人
成功的女人后面有一个傻傻的男人
男生恋爱时:遇到不会的事儿也要装懂
女生恋爱时:遇到会的事儿也要装不懂

仔细思考一下我们会发现:人对应的Element接口,男人女人就是俩个具体实现类,成功和恋爱的状态就是Visitor,每个状态下对应的不同的是Element具体实现类的不同处理方式,由此对应的是俩个具体Visitor实现类,最后多个Element元素需要我们使用集合来存储。

Visitor接口

package com.visitor;

//遇到的一个状态(一般情况下:其定义的方法个数与Element实现类个数相等)
public interface Visitor{
   
   

    void visitConcreteElementA(ConcreteElementA concreteElementA);

    void visitConcreteElementB(ConcreteElementB concreteElementB);

}

ConcreteVisitor1具体类

package com.visitor;

//成功这个状态
public class ConcreteVisitor1 implements Visitor{
   
   

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
   
   
        // TODO Auto-generated method stub
        System.out.println("成功的男人后面有一个贤惠的女人");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
   
   
        // TODO Auto-generated method stub
        System.out.println("成功的女人后面有一个傻傻的男人");
    }

}

ConcreteVisitor2具体类

package com.visitor;

//恋爱这个状态
public class ConcreteVisitor2 implements Visitor{
   
   

    @Override
    public void visitConcreteElementA(ConcreteElementA concreteElementA) {
   
   
        // TODO Auto-generated method stub
        System.out.println("男生恋爱时:遇到不会的事儿也要装懂");
    }

    @Override
    public void visitConcreteElementB(ConcreteElementB concreteElementB) {
   
   
        // TODO Auto-generated method stub
        System.out.println("女生恋爱时:遇到会的事儿也要装不懂");
    }

}

Element接口

package com.visitor;

//人处理事情的方式
public interface Element {
   
   
    void accept(Visitor visitor);
}

ConcreteElementA具体类

package com.visitor;

//男人处理事情的方式
public class ConcreteElementA implements Element{
   
   

    @Override
    public void accept(Visitor visitor) {
   
   
        // TODO Auto-generated method stub
        visitor.visitConcreteElementA(this);
    }

}

ConcreteElementB具体类

package com.visitor;

//女人处理事情的方式
public class ConcreteElementB implements Element{
   
   

    @Override
    public void accept(Visitor visitor) {
   
   
        // TODO Auto-generated method stub
        visitor.visitConcreteElementB(this);
    }

}

ObjectStructure类

package com.visitor;

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

public class ObjectStructure{
   
   
    private List<Element> list=new ArrayList<>();

    public void addElement(Element element){
   
   
        list.add(element);
    }

    public void removeElement(Element element){
   
   
        list.remove(element);
    }

    public void accept(Visitor visitor){
   
   
        for(Element e:list){
   
   
            e.accept(visitor);
        }
    }
}

测试代码

package com.visitor;

public class Main {
   
   
    public static void main(String[] args){
   
   
        ObjectStructure objectStructure=new ObjectStructure();
        objectStructure.addElement(new ConcreteElementA());
        objectStructure.addElement(new ConcreteElementB());

        ConcreteVisitor1 concreteVisitor1=new ConcreteVisitor1();
        ConcreteVisitor2 concreteVisitor2=new ConcreteVisitor2();

        objectStructure.accept(concreteVisitor1);
        objectStructure.accept(concreteVisitor2);

    }
}

运行结果展示:

image.png

好了,到这里【Java中23种面试常考的设计模式之访问者模式(Visitor)---行为型模式】就结束了,23种设计模式持续更新汇总中。

相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
24天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
63 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
24天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
29天前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
34 6
|
1月前
|
设计模式 Java 数据库连接
Java编程中的设计模式:单例模式的深度剖析
【10月更文挑战第41天】本文深入探讨了Java中广泛使用的单例设计模式,旨在通过简明扼要的语言和实际示例,帮助读者理解其核心原理和应用。文章将介绍单例模式的重要性、实现方式以及在实际应用中如何优雅地处理多线程问题。
38 4
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
61 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
125 4
|
1月前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。