JAVA设计模式之访问者模式原理与用法详解

发布时间 - 2026-01-11 02:38:29    点击率:

本文实例讲述了JAVA设计模式之访问者模式。分享给大家供大家参考,具体如下:

访问者模式:

一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。

结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。

适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。

优点:

1、符合单一职责原则
2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。

缺点:

1、如果要增加新元素,则会让操作变得更复杂
2、在一定程序上破坏了封装性原则

访问者械五大角色对象:

1.Visitor 抽象访问者角色
2.ConcreteVisitor.具体访问者角色
3.Element 接受访问操作元素
4.ConcreteElement 具体元素
5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。

/**
 * 抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口。
 * 该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,
 * 这样访问者就可以通过该元素角色的特定接口直接访问它。
 * @description:
 * @date 2016-1-15 下午4:00:29
 */
public interface Visitor {
  void visit(Element element);
}

/**
 * 具体访问者角色,实现Visitor声明的接口。
 * @description:
 * @date 2016-1-15 下午4:20:46
 */
public class ConcreteVisitor implements Visitor{
  @Override
  public void visit(Element element) {
    Staff e=(Staff) element;
    //比如:加薪的计算方式:职位*加薪系数+工龄*对应系统之和 除以10 再乘以现在工资
    System.out.println(e.getName()+"要加的薪水是:"+(e.getDegree()*0.8+e.getWorkAges()*0.5)/10*e.getSalary());//
  }
}

/**
 * 定义一个接受访问操作类,访问者(Visitor)操作函数的参数。
 * @description:
 * @date 2016-1-15 下午3:58:28
 */
public abstract class Element {
  public abstract void Acceppt(Visitor visitor);
}

/**
 * 具体元素,实现了抽象元素(Element)所定义的接受操作接口。
 * @description:
 * @date 2016-1-15 下午4:04:24
 */
public class Staff extends Element {
  private String name;
  private float salary;
  private int workAges;
  private int degree;
  public Staff(String name, float salary, int workAges, int degree) {
    super();
    this.name = name;
    this.salary = salary;
    this.workAges = workAges;
    this.degree = degree;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public float getSalary() {
    return salary;
  }
  public void setSalary(float salary) {
    this.salary = salary;
  }
  public int getWorkAges() {
    return workAges;
  }
  public void setWorkAges(int workAges) {
    this.workAges = workAges;
  }
  public int getDegree() {
    return degree;
  }
  public void setDegree(int degree) {
    this.degree = degree;
  }
  @Override
  public void Acceppt(Visitor visitor) {
    visitor.visit(this);
  }
}

/**
 * 结构对象:这是使用访问者模式必备的角色。
 * 它具备以下特性:
 * 能枚举它的元素;
 * 可以提供一个高层接口以允许访问者访问它的元素;
 * 如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
 * @description:
 * @date 2016-1-15 下午4:26:30
 */
public class StaffObject {
  private HashMap<String, Staff> employees;
  public StaffObject() {
    employees = new HashMap<String, Staff>();
  }
  public void addEmployee(Staff e) {
    if (!employees.containsKey(e.getName())) {
      employees.put(e.getName(), e);
    }
  }
  public void removeEmployee(Staff e) {
    if (employees.containsKey(e.getName())) {
      employees.remove(e);
    }
  }
  public Staff getEmployee(String name) {
    return employees.get(name);
  }
  public void Accept(Visitor v) {
    for (Staff e : employees.values()) {
      e.Acceppt(v);
    }
  }
}

测试类

public class Test {
  public static void main(String[] args) {
    StaffObject e=new StaffObject();
    e.addEmployee(new Staff("张三", 3000f, 2, 1));
    e.addEmployee(new Staff("李四", 5000f, 4, 2));
    e.addEmployee(new Staff("王五", 8000f, 6, 3));
    e.addEmployee(new Staff("沈七", 10000f, 9, 4));
    e.Accept(new ConcreteVisitor());
  }
}

运行结果:

李四要加的薪水是:1800.0
张三要加的薪水是:540.0
沈七要加的薪水是:7700.0
王五要加的薪水是:4320.0

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。


# JAVA  # 设计模式  # 访问者模式  # Java设计模式之访问者模式  # 深入理解Java设计模式之访问者模式  # Java设计模式之java访问者模式详解  # Java设计模式之访问者模式使用场景及代码示例  # 举例讲解设计模式中的访问者模式在Java编程中的运用  # 详解Java设计模式编程中的访问者模式  # JAVA设计模式之访问者模式详解  # Java访问者模式实现优雅的对象结构处理  # 数据结构  # 下午  # 这是  # 作用于  # 操作技巧  # 李四  # 王五  # 相关内容  # 如有  # 遍历  # 适用于  # 感兴趣  # 可以通过  # 给大家  # 五大  # 使你  # 在一  # 提供一个  # 来实现  # 则会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用Gate和Policy进行授权?(权限控制)  怎样使用JSON进行数据交换_它有什么限制  如何做网站制作流程,*游戏网站怎么搭建?  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  如何在阿里云购买域名并搭建网站?  如何在阿里云部署织梦网站?  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  如何快速生成可下载的建站源码工具?  网站制作壁纸教程视频,电脑壁纸网站?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Python文件流缓冲机制_IO性能解析【教程】  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  郑州企业网站制作公司,郑州招聘网站有哪些?  JavaScript常见的五种数组去重的方式  如何打造高效商业网站?建站目的决定转化率  如何快速搭建个人网站并优化SEO?  Android自定义listview布局实现上拉加载下拉刷新功能  如何在云主机上快速搭建多站点网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何在IIS中新建站点并解决端口绑定冲突?  如何在景安云服务器上绑定域名并配置虚拟主机?  如何在自有机房高效搭建专业网站?  Linux系统运维自动化项目教程_Ansible批量管理实战  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Android仿QQ列表左滑删除操作  Laravel怎么实现模型属性的自动加密  实例解析angularjs的filter过滤器  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何彻底删除建站之星生成的Banner?  C++时间戳转换成日期时间的步骤和示例代码  Laravel如何实现模型的全局作用域?(Global Scope示例)  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何在万网自助建站平台快速创建网站?  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  微信推文制作网站有哪些,怎么做微信推文,急?  如何在服务器上配置二级域名建站?  独立制作一个网站多少钱,建立网站需要花多少钱?  大连 网站制作,大连天途有线官网?  Laravel中的Facade(门面)到底是什么原理  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  公司网站制作需要多少钱,找人做公司网站需要多少钱?