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

16.访问者模式

一.什么是访问者模式

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

二、角色

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

三、代码

1、抽象访问者

java 复制代码
public interface Tasker {
    void visitZhuang(ZhuangHero zhuangHero);
    void visitZhen(ZhenHero zhenHero);
}

2、具体访问者1

java 复制代码
public class MyTasker implements Tasker {


    @Override
    public void visitZhuang(ZhuangHero zhuangHero) {
        System.out.println("我访问了庄周,庄周释放技能");
        zhuangHero.operate();
    }


    @Override
    public void visitZhen(ZhenHero zhenHero) {
        System.out.println("我访问了甄姬,甄姬释放技能");
        zhenHero.operate();
    }
}

具体访问者2
public class OtherTasker implements Tasker {


    @Override
    public void visitZhuang(ZhuangHero zhuangHero) {
        System.out.println("其他人访问庄周,庄周开始使出技能");
        zhuangHero.operate();
    }


    @Override
    public void visitZhen(ZhenHero zhenHero) {
        System.out.println("其他人访问甄姬,庄周开始使出技能");
        zhenHero.operate();
    }
}

3、抽象元素

java 复制代码
public abstract class Hero {
    public abstract void accept(Tasker tasker);
}

4、具体元素(1)

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

具体元素(2)

java 复制代码
@NoArgsConstructor
@Data
public class ZhuangHero extends Hero {

    @Override
    public void accept(Tasker tasker) {
        tasker.visitZhuang(this);
    }

    public void operate(){
        System.out.println("庄周释放出技能");
    }
}

5.对象结构

java 复制代码
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.测试类

java 复制代码
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);

    }
}
相关推荐
EXI-小洲10 小时前
Java 操作 Word:字符串替换、图片插入、动态生成表格与API接口下载
java·开发语言·spring boot·word
2601_9619017011 小时前
SpringBoot使用Nacos进行application.yml配置管理
java·spring boot·spring
何以解忧,唯有..12 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
QQ_216962909612 小时前
【源码编号:project79475】SpringBoot校内二手交易平台:商品发布、分类检索、留言交流、订单管理全流程实战
java·spring boot·后端
前端 贾公子13 小时前
第09章:上下文与记忆 (2)
java·服务器·前端
2601_9622035113 小时前
Java进阶07集合(续)
java·开发语言
郑州光合科技余经理14 小时前
本地生活服务系统:模块边界与结算字段怎么拆
java·开发语言·前端·后端·系统架构·uni-app·php
roman_日积跬步-终至千里14 小时前
【数据治理(6)】DataOps 不是调度工具,而是让数据产品长期可信的运行机制
java·服务器·网络
workflower14 小时前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
落魄大学生之流水线上谋生计14 小时前
LangGraph 基本用法指南
java·windows·python·langchain