Java设计模式:访问者模式

Java设计模式访问者模式:从基础到高级的全面解析 访问者模式是一种将数据结构与操作分离的行为型设计模式。它通过在抽象访问者中定义访问方法,允许在不修改元素类的情况下扩展新操作。主要角色包括抽象访问者、具体访问者、抽象元素、具体元素和对象结构。该模式的优点是符合单一职责原则、扩展性好,但缺点是增加新元素类困难且可能破坏封装性。典型应用场景如商品价格计算,通过访问者实现不同价格策略而不改变商品类本身。 阅读详情

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

一、认识访问者模式

1、概念

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

如何来理解呢?举个例子来说吧,假如我们都玩过王者荣耀。每个英雄都有三个基本的技能,但是不同的玩家操作英雄技能实现的方式是不一样的。比如说你玩韩信只能送人头,梦泪玩韩信那就是百战百胜。
在这个例子中,庄周和甄姬的三个基本的技能是不变的,但是访问者模式能够在这三个技能之上实现一些不同的效果。我们可以画一张类图进一步去了解它。

2、类图
在这里插入图片描述
相信说这种模式比较复杂的都是因为其类图吧,不过我们为每一个模块进行着色之后就能发现其实没那么麻烦。以上类图一共涉及到了六个角色:
(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);
	}
}

最后一步我们就能看到结果了
在这里插入图片描述
这就是访问者模式。

三、分析访问者模式

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

我是小架,我们下篇文章见!

SQLSTATE58030 在优化一条SQL的时候遇到了执行错误 gtlions =# select t1.telnumber,t2.ua,t2.url,t1.apply_name,t2.apply_name from tb1 t1 gtlions -# left outer join tb2 t2 on t1.sid = t2.ipsid gtlions-# where t1.sum_date=20141128 a 阅读详情

相关推荐

如何使用Github创建一个完全免费的个人网站

摘要: 本文详细介绍如何利用Github Pages免费搭建个人静态网站,适合零基础用户。首先需注册Github账号并创建特定命名的仓库(格式:用户名.github.io),然后通过网页或命令行创建index.html文件作为网站首页。完成后可通过"仓库设置- Pages"获取网站链接。文章还包含GitHub Desktop的安装使用、代码提交指南及常见问题自检方法,并说明即使Github被墙也可迁移至国内平台(如码云)。整个过程无需编程基础,仅需15分钟即可完成基础网站搭建。

安德洛夫 1454

访问者模式

写这篇文章之前,我也看了十几篇网络大牛写的访问者设计模式的文章,都说这个访问者模式是最复杂的一个,但是我觉得跟其他的设计模式并没有太多的不同,因此自己整理了一下,相信大多数人都能看懂。 一、认识访问者模式 1、概念 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下,定义作用于这些元素的新操作。 如何来理解呢?举个例子来说吧,假如我们都玩过王者荣耀。每个英雄都有三个...

冯冬冬的博客 276

2021年电赛D题基于互联网的摄像测量系统.zip

2021年电赛D题基于互联网的摄像测量系统.zip

java设计抽象英雄类_java抽象工厂设计模式之游戏实例解析(大话java&英雄联盟)...

# 原创作品,转载请注明出处,谢谢!@杨福星(http://blog.csdn.net/luckystar92/article/details/52176737)*前言:最近在学习抽象工厂设计模式,网上也查询了不少资料,本文是自己学习中的一点理解,以便后期回顾!好记性不如烂笔头!…^_ ^概念:抽象工程设计模式——“是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,...

weixin_35959421的博客 651

访问者模式坦克大战实现

目录:《一个实例讲完23种设计模式》 当前:抽象工厂 需求:坦克大战 创建两种坦克 坦克类型 射程 速度 b70 70米 时/70公里 b50 50米 时/70公里 类图 代码 interface IVisitor{ void visitConcreteTank(ITank t); void execute(int type);...

xie__jin__cheng的博客 404

Java理解抽象类与接口游戏人物简单案例

为了更好地理解和掌握抽象类与接口的概念,做了一个以简单游戏人物设计来加深理解的案例。 1、首先分析游戏人物的类型假如分为战士、法师和射手类英雄他们三种同属于英雄有姓名,购买价格,英雄生命值属性,都有行走、释放技能的行为而每种英雄的技能有可能不一样所以将技能的方法设置为抽象方法。 package com.miaoxiake.day03; /** * 英雄类 * @author 喵喵侠客 ...

qq_38217237的博客 2320

java设计抽象英雄类_从王者荣耀看设计模式-策略模式(java版)

王者荣耀曾经我也是一名玩农药的大学生,但现在已经弃了,别问我为什么(被坑爹队友坑的哭。。。)。而今天我们来把让农药变荣耀,我们来从王者荣耀中看设计模式的策略模式。射手00.分析我们先来思考,王者荣耀现在已经发展到60多个英雄了,他们大致分为坦克,战士,刺客,射手,法师,辅助六种角色。因为我喜欢玩射手,下面就拿射手来说明吧。射手相同的特征是射击,但每个射手都有不同的射击状态,可以佩戴不同的召唤师技能...

weixin_34141225的博客 1714

java设计模式访问者模式

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

pscool的博客 1191

java设计模式之:访问者模式

访问者模式(Visitor Pattern):提供一个作用于某对象结构中的各元素的操作表示,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式是一种对象行为型模式。访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。

初念初恋的博客 1301

java设计模式 访问者模式_Java设计模式Java 访问者模式

访问者模式中,元素对象接受访问者对象,而访问者对象处理元素对象上的操作。此模式是一种行为模式。通过这种方式,可以从不同的访问者改变元素的执行算法。例子class TreeNode {private String name;public TreeNode(String name) {this.name = name;}public String getName() {return name;}pu...

weixin_35650041的博客 69

JAVA设计模式之:访问者模式

访问者模式: 一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。 结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。 适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。 优点: 1、符合单一职责原则 2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。 缺点: 1、如果

true100的专栏 1132

JAVA设计模式访问者模式

访问者模式 Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作。 比如有一个公园,有一到多个不同的组成部分;该公园存在多个访问者:清洁工A负责打扫公园的A部分,清洁工B负责打扫公园的B部分,公园的管理者负责检点各项事务是否完成,上级领导可以视察公园等等。也就是说,对于同一个公园,不同的访问者有不同的行为操作,而且...

Derrick 163

Java设计模式之行为型:访问者模式

访问者模式适用于数据结构相对稳定的系统,将数据结构与基于数据的操作进行分离,使得添加作用于这些数据结构的新操作变得简单,并且不需要改变各数据结构,为不同类型的数据结构提供多种访问操作方式,这样是访问者模式的设计动机。除了使新增访问操作变得更加简单,也能够在不修改现有类的层次结构下,定义该类层次结构的操作,并将有关元素对象的访问行为集中到一个访问者对象中,而不是分散搞一个个的元素类中。但访问者模式的缺点在于让增加新的元素类变得困难,每增加一个新的元素类都意味着要在抽象访问者角色中增加一个新的抽象操作。

张维鹏的博客 1万+

Java设计模式之模板模式【通过LOL选英雄案例】

初衷 设计模式(Design Pattern)引用百度百科中的一句话,就是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。实际上在我们的实际编码中到处都有设计模式的影子,比如最常用的单例模式,工厂模式,代理模式,观察者模式等等。其实每种设计模式都有自己的用法和体系,它让代码编写实现真正的工程化,如果使用得当会极大的优化我们的编码效率和规范。所以对于每一个软件工程师来说,掌握几种常用的...

zxl_LangYa的博客 1566

C++(22)--继承和派生

继承和派生 《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》 -------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)--------------- 面向对象oop–三大重要特性-- 封装、继承、多态 在C++中,代码重用是通过“继承(inheritance)”机制实现的。 在一个已经存在的类的基础上,再建立一个新类。 从已有的类中派生出新类,派生类就继承了原有类(基类)的特征,包括成员和方法(以后函

sinat_40624829的博客 666

设计模式--装饰器模式

装饰器模式装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。简单来说,装饰器模式就是在不改变原有类的结构和功能上,通过实现共有接口方式,加强了自身的功能。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的...

hirezy 415

【你不知道的Java】-【抽象类、内部类】

抽象类、内部类对于初学者来说,可能比较模糊,只停留在概念上,下面,就用大家耳熟能详的DOTA中的操作来做简单说明。 一:要干什么? 用抽象类和内部类在描述DOTA中英雄释放4个技能的操作。 什么?你不知道有4个技能,那么.....你先去玩几把DOTA再说。 二: 英雄类-抽象类 所有英雄都要继承这个类,顺带用枚举表示了下四个技能。 package co

小黑屋[菜鸟学堂] 922

C++面向对象游戏模型

简单模拟一下“英雄联盟”的模型,先把所有英雄抽象成Hero,他们有很多共同的属性和攻击特性,所以先定义一个抽象类 #ifndef __HERO__ #define __HERO__ #define TRUE 1 #define FALSE 0 typedef enum ability { ABILITY_Q = 0x0000000a, ABILITY_W = 0x0000000b

沐浴晨风想一想,今天该怎样努力;踏着夕阳问一问,今天学到了什么。 1091

通俗易懂系列 | 设计模式(二):装饰模式

2018国庆黄金周来了,恰值国庆黄金周节假日,我想高速上一定车山车海,还好我选择了高铁,不然肯定需要寻找项目合作人或在高速上吃创业人士的炒饭炒面了。 国庆7天长假,天气又如此的好,所谓风和日丽,如此良辰美景,回家的你一定会发现路上结婚的车队是来来往往,特别是领头的婚车,鲜花与气球给装饰的是大气,豪华。当然婚车里的新娘也是精心装扮,那是,挽青丝,双环结,百合鬓边巧装点。白婚纱,如飘烟,红颜新妆比花...

JaJian的博客 230
上一篇: 阿里P7程序员推荐,线程的原子性,可见性,有序性(二)
下一篇: 实战java高并发程序设计-jdk8,9,10与并发
Java架构Monster
博客等级 码龄7年 18粉丝 64原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值