全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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程序设计有所帮助。


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


相关文章: 如何在香港服务器上快速搭建免备案网站?  建站之星×万网:智能建站系统+自助建站平台一键生成  网站专业制作公司有哪些,做一个公司网站要多少钱?  打鱼网站制作软件,波克捕鱼官方号怎么注册?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  建站之星会员如何解锁更多建站功能?  宝塔面板如何快速创建新站点?  制作农业网站的软件,比较好的农业网站推荐一下?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  如何使用Golang安装API文档生成工具_快速生成接口文档  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  宝塔建站无法访问?如何排查配置与端口问题?  完全自定义免费建站平台:主题模板在线生成一站式服务  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何在腾讯云服务器上快速搭建个人网站?  如何通过虚拟主机空间快速建站?  如何在阿里云虚拟服务器快速搭建网站?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  如何在IIS中新建站点并配置端口与IP地址?  如何撰写建站申请书?关键要点有哪些?  高性价比服务器租赁——企业级配置与24小时运维服务  如何确认建站备案号应放置的具体位置?  建站上传速度慢?如何优化加速网站加载效率?  建站之星安装后如何自定义网站颜色与字体?  教学论文网站制作软件有哪些,写论文用什么软件 ?  ,sp开头的版面叫什么?  定制建站模板如何实现SEO优化与智能系统配置?18字教程  教学网站制作软件,学习*后期制作的网站有哪些?  太原网站制作公司有哪些,网约车营运证查询官网?  如何通过宝塔面板实现本地网站访问?  如何选择美橙互联多站合一建站方案?  C#怎么创建控制台应用 C# Console App项目创建方法  如何制作一个表白网站视频,关于勇敢表白的小标题?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  高防服务器:AI智能防御DDoS攻击与数据安全保障  公司网站设计制作厂家,怎么创建自己的一个网站?  建站之星安装失败:服务器环境不兼容?  深圳网站制作案例,网页的相关名词有哪些?  头像制作网站在线制作软件,dw网页背景图像怎么设置?  如何在阿里云通过域名搭建网站?  如何快速查询域名建站关键信息?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  家具网站制作软件,家具厂怎么跑业务?  建站主机CVM配置优化、SEO策略与性能提升指南  深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  英语简历制作免费网站推荐,如何将简历翻译成英文?  如何高效完成自助建站业务培训?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。