java设计模式之访问者模式

简介: 写这篇文章之前,我也看了十几篇网络大牛写的访问者设计模式的文章,都说这个访问者模式是最复杂的一个,但是我觉得跟其他的设计模式并没有太多的不同,因此自己整理了一下,相信大多数人都能看懂。

一、认识访问者模式


1、概念


封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。


如何来理解呢?举个例子来说吧,假如我们都玩过王者荣耀。每个英雄都有三个基本的技能,但是不同的玩家操作英雄技能实现的方式是不一样的。比如说你玩韩信只能送人头,梦泪玩韩信那就是百战百胜。


在这个例子中,庄周和甄姬的三个基本的技能是不变的,但是访问者模式能够在这三个技能之上实现一些不同的效果。我们可以画一张类图进一步去了解它。


2、类图

v2-1e9dc69a0a6d80b9a4905da9a44b02e9_1440w.jpg

相信说这种模式比较复杂的都是因为其类图吧,不过我们为每一个模块进行着色之后就能发现其实没那么麻烦。以上类图一共涉及到了六个角色:


(1) Vistor(抽象访问者):为该对象结构中具体元素角色声明一个访问操作接口。就好像是王者荣耀里面不同的玩家。

(2) ConcreteVisitor(具体访问者):每个具体访问者都实现了Vistor中定义的操作。就好比是具体某一个玩家。

(3) Element(抽象元素):定义了一个accept操作,以Visitor作为参数。可以类比成王者里面英雄的模板。

(4) ConcreteElement(具体元素):实现了Element中的accept()方法,调用Vistor的访问方法以便完成对一个元素的操作。可以表示为具体某一个英雄,好比是庄周和甄姬。

(5) ObjectStructure(对象结构):可以是组合模式,也可以是集合;能够枚举它包含的元素;提供一个接口,允许Vistor访问它的元素。也就是庄周和甄姬允许外界访问的元素。


有了这个概念,下面我们就可以使用代码来分析一下了。


二、代码实现


第一步:定义抽象元素(英雄的模板)

public abstract class Hero {
    //英雄可以接受玩家的访问,让玩家来操作
    public abstract void accept(Player visitor);
}


第二步:定义具体元素(具体某一个英雄)


首先我们可以定义甄姬

//甄姬
public class ZhenHero extends Hero {
    //可以接受玩家的操作
    @Override
    public void accept(Player visitor) {
        visitor.visitZhen(this);
    }
    //自身的技能
    public void operate() {
        System.out.println("甄姬放出了技能");
    }
}

还有一个庄周

//庄周
public class ZhuangHero extends Hero {
    //接受外部的访问
    @Override
    public void accept(Player visitor) {
        visitor.visitZhuang(this);
    }
    //自身的技能
    public void operate() {
        System.out.println("庄周放出了技能");
    }
}

第三步:定义抽象访问者(玩家)

//玩家可以访问甄姬和庄周的技能
public interface Player {
    public abstract void visitZhuang(ZhuangHero element);
    public abstract void visitZhen(ZhenHero element);
}

第四步:定义具体访问者(玩家我和其他玩家)


首先是我自己操作

public class PlayerMe implements Player {
    @Override
    public void visitZhuang(ZhuangHero element) {
        System.out.println("玩家我访问庄周,庄周开始使出技能");
        element.operate();
    }
    @Override
    public void visitZhen(ZhenHero element) {
        System.out.println("玩家我访问甄姬,甄姬开始使出技能");
        element.operate();
    }
}

然后是其他玩家操作

public class PlayerOthers implements Player {
    @Override
    public void visitZhuang(ZhuangHero element) {
        System.out.println("玩家其他人访问庄周,庄周开始使出技能");
        element.operate();
    }
    @Override
    public void visitZhen(ZhenHero element) {
        System.out.println("玩家其他人访问甄姬,甄姬开始使出技能");
        element.operate();
    }
}

第五步:定义对象结构

public class ObjectStructure {
    //保存所有需要被访问的元素
    private List<Hero> heros = new ArrayList<Hero>();
    public void handleRequest(Player visitor) {
        //访问所有元素
        for(Hero hero : heros) {
            hero.accept(visitor);
        }
    }
    public void addHero(Hero hero) {
        heros.add(hero);
    }
}

第六步:客户端测试一下

public class Client {
    public static void main(String[] args) {
        ObjectStructure os = new ObjectStructure();
        Hero zhuang = new ZhuangHero();
        Hero zhen = new ZhenHero();
        os.addHero(zhuang);
        os.addHero(zhen);
        Player visitorMe = new PlayerMe();
        Player visitorOthers = new PlayerOthers();
        // 让访问者访问对象结构中的元素
        os.handleRequest(visitorMe);
        os.handleRequest(visitorOthers);
    }
}

最后一步我们就能看到结果了

v2-3bda3960c05a9742dc23b3304905841d_1440w.jpg

这就是访问者模式。


三、分析访问者模式


访问者模式使用的条件在于对象的结构一般不宜发生改变,但是操作缺不一样的情况。比如复杂的集合对象、XML文档解析、编译器的设计等就常常会用到这个模式。

优点在于访问者模式解决的问题,也就是使用场景,缺点就是不使用对象结构宜发生改变的情况。

相关文章
|
5月前
|
设计模式 网络协议 数据可视化
Java 设计模式之状态模式:让对象的行为随状态优雅变化
状态模式通过封装对象的状态,使行为随状态变化而改变。以订单为例,将待支付、已支付等状态独立成类,消除冗长条件判断,提升代码可维护性与扩展性,适用于状态多、转换复杂的场景。
771 157
|
5月前
|
设计模式 Java Spring
Java 设计模式之责任链模式:优雅处理请求的艺术
责任链模式通过构建处理者链,使请求沿链传递直至被处理,实现发送者与接收者的解耦。适用于审批流程、日志处理等多级处理场景,提升系统灵活性与可扩展性。
621 2
|
7月前
|
设计模式 缓存 Java
Java设计模式(二):观察者模式与装饰器模式
本文深入讲解观察者模式与装饰器模式的核心概念及实现方式,涵盖从基础理论到实战应用的全面内容。观察者模式实现对象间松耦合通信,适用于事件通知机制;装饰器模式通过组合方式动态扩展对象功能,避免子类爆炸。文章通过Java示例展示两者在GUI、IO流、Web中间件等场景的应用,并提供常见陷阱与面试高频问题解析,助你写出灵活、可维护的代码。
|
5月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
1114 35
|
5月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
471 8
|
10月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
217 0
|
7月前
|
设计模式 安全 Java
Java设计模式(一):单例模式与工厂模式
本文详解单例模式与工厂模式的核心实现及应用,涵盖饿汉式、懒汉式、双重检查锁、工厂方法、抽象工厂等设计模式,并结合数据库连接池与支付系统实战案例,助你掌握设计模式精髓,提升代码专业性与可维护性。
|
7月前
|
设计模式 XML 安全
Java枚举(Enum)与设计模式应用
Java枚举不仅是类型安全的常量,还具备面向对象能力,可添加属性与方法,实现接口。通过枚举能优雅实现单例、策略、状态等设计模式,具备线程安全、序列化安全等特性,是编写高效、安全代码的利器。
|
10月前
|
设计模式 XML JSON
【设计模式】【行为型模式】访问者模式(Visitor)
一、入门 什么是访问者模式? 访问者模式(Visitor Pattern)是一种行为设计模式,允许你将算法与对象结构分离。通过这种方式,可以在不改变对象结构的情况下,向对象结构中的元素添加新的操作。
321 10
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
331 124

热门文章

最新文章