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种设计模式持续更新汇总中。

相关文章
|
3月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
371 2
|
3月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
374 0
|
5月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
3月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
440 35
|
4月前
|
算法 Java
50道java集合面试题
50道 java 集合面试题
|
3月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
345 8
|
5月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
5月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
4月前
|
算法 Java
50道java基础面试题
50道java基础面试题