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

 更新时间:2017年08月04日 08:58:13   作者:迟做总比不做强  
这篇文章主要介绍了JAVA设计模式之访问者模式,简单说明了访问者模式的原理,并结合实例分析了java访问者模式的定义与用法,需要的朋友可以参考下

本文实例讲述了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程序设计有所帮助。

相关文章

  • spring boot实现图片上传和下载功能

    spring boot实现图片上传和下载功能

    这篇文章主要为大家详细介绍了spring boot实现图片上传和下载功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • Java多线程编程中使用Condition类操作锁的方法详解

    Java多线程编程中使用Condition类操作锁的方法详解

    Condition是java.util.concurrent.locks包下的类,提供了对线程锁的更精细的控制方法,下面我们就来看一下Java多线程编程中使用Condition类操作锁的方法详解
    2016-07-07
  • 浅谈Java数据结构之稀疏数组知识总结

    浅谈Java数据结构之稀疏数组知识总结

    今天带大家了解一下Java稀疏数组的相关知识,文中有非常详细的介绍及代码示例,对正在学习java的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05
  • Mybatis批量插入数据返回主键的实现

    Mybatis批量插入数据返回主键的实现

    这篇文章主要介绍了Mybatis批量插入数据返回主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Redis缓存,泛型集合与json字符串的相互转换实例

    Redis缓存,泛型集合与json字符串的相互转换实例

    这篇文章主要介绍了Redis缓存,泛型集合与json字符串的相互转换实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • JDK安装配置教程

    JDK安装配置教程

    这篇文章主要为大家详细介绍了JDK安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • MybatisPlus修改时空字段无法修改的解决方案

    MybatisPlus修改时空字段无法修改的解决方案

    这篇文章主要介绍了MybatisPlus修改时空字段无法修改的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java实现走迷宫回溯算法

    Java实现走迷宫回溯算法

    这篇文章主要为大家详细介绍了Java实现走迷宫回溯算法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Java中方法名称和泛型相同的用法示例

    Java中方法名称和泛型相同的用法示例

    这篇文章主要介绍了Java中方法名称和泛型相同的用法,结合实例形式分析了泛型替代方法名称的相关使用技巧,需要的朋友可以参考下
    2019-08-08
  • java 实现当前时间加减30分钟的时间代码

    java 实现当前时间加减30分钟的时间代码

    这篇文章主要介绍了java 实现当前时间加减30分钟的时间代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论