当前位置: 首页 > backend >正文

java 设计模式_行为型_16访问者模式

16.访问者模式

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

二、角色

  • (1) Vistor(抽象访问者):为该对象结构中具体元素角色声明一个访问操作接口。
  • (2) ConcreteVisitor(具体访问者):每个具体访问者都实现了Vistor中定义的操作。
  • (3) Element(抽象元素):定义了一个accept操作,以Visitor作为参数。
  • (4) ConcreteElement(具体元素):实现了Element中的accept()方法,调用Vistor的访问方法以便完成对一个元素的操作。
  • (5) ObjectStructure(对象结构):可以是组合模式,也可以是集合;能够枚举它包含的元素;提供一个接口,允许Vistor访问它的元素。

三、代码
1、抽象访问者

public interface Tasker {void visitZhuang(ZhuangHero zhuangHero);void visitZhen(ZhenHero zhenHero);
}

2、具体访问者1

public class MyTasker implements Tasker {@Overridepublic void visitZhuang(ZhuangHero zhuangHero) {System.out.println("我访问了庄周,庄周释放技能");zhuangHero.operate();}@Overridepublic void visitZhen(ZhenHero zhenHero) {System.out.println("我访问了甄姬,甄姬释放技能");zhenHero.operate();}
}具体访问者2
public class OtherTasker implements Tasker {@Overridepublic void visitZhuang(ZhuangHero zhuangHero) {System.out.println("其他人访问庄周,庄周开始使出技能");zhuangHero.operate();}@Overridepublic void visitZhen(ZhenHero zhenHero) {System.out.println("其他人访问甄姬,庄周开始使出技能");zhenHero.operate();}
}

3、抽象元素

public abstract class Hero {public abstract void accept(Tasker tasker);
}

4、具体元素(1)

@Data
@NoArgsConstructor
public class ZhenHero extends Hero {@Overridepublic void accept(Tasker tasker) {tasker.visitZhen(this);}public void operate(){System.out.println("甄姬释放出技能");}
}

具体元素(2)

@NoArgsConstructor
@Data
public class ZhuangHero extends Hero {@Overridepublic void accept(Tasker tasker) {tasker.visitZhuang(this);}public void operate(){System.out.println("庄周释放出技能");}
}

5.对象结构

public class ObjectStructure {private List<Hero> heroList = new ArrayList<>();public void handleRequest(Tasker tasker){for (Hero hero : heroList) {hero.accept(tasker);}}public void addHero(Hero hero){heroList.add(hero);}}

6.测试类

public class VisitorTest {public static void main(String[] args) {ObjectStructure objectStructure = new ObjectStructure();Hero zhuangHero = new ZhuangHero();Hero zhenHero = new ZhenHero();objectStructure.addHero(zhuangHero);objectStructure.addHero(zhenHero);Tasker myTasker = new MyTasker();Tasker otherTasker = new OtherTasker();objectStructure.handleRequest(myTasker);objectStructure.handleRequest(otherTasker);}
}
http://www.xdnf.cn/news/14303.html

相关文章:

  • C++继承和多态
  • 基于ssm的老年人健康管理系统
  • 手机验证码自动化处理:从原理到企业级解决方案
  • 从数据孤岛到智能决策:数据编排如何重构企业数据架构?
  • Magentic-ui项目相关整理
  • java 设计模式_行为型_14策略模式
  • Seata如何与Spring Cloud整合?
  • MATLAB交互式贝塞尔曲线演示
  • Softhub软件下载站实战开发(一):项目总览
  • python中判断与循环使用
  • 怎么理解自动驾驶技术中的agent
  • MVVM框架:让前端开发像搭积木一样简单!
  • spring-security5-oauth2系列:密码授权模式
  • Go同步原语与数据竞争:原子操作(atomic)
  • 【LangChain】4 基于文档的问答
  • 【量化】策略交易之动量策略(Momentum)
  • Transformer实战——从词袋模型到Transformer:NLP技术演进
  • Kubernetes镜像拉取认证指南
  • 勇者和魔塔的算法题
  • Linux进程池详解:从入门到理解
  • Vue 3 九宫格抽奖系统,采用优雅的 UI 设计和流畅的动画效果
  • 【工具变量】全国分省数字基础设施水平数据集-含原始数据及处理代码(2005-2024年)
  • LLMs 系列实操科普(6)
  • 网络代理设置
  • leetcode0765. 情侣牵手-hard
  • HTTP和HTTPS协议
  • Design Compiler:解组(Ungroup)
  • Modbus协议全方位解析与C#开发实战指南
  • Apache Doris FE 问题排查与故障分析全景指南
  • TI 毫米波雷达走读系列—— 3DFFT及测角