这篇文章将为大家详细讲解有关怎么中JAVA项目中实现一个访问者模式,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
洛宁网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联公司2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
访问者模式:
一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。
结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。
适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。
优点:
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 HashMapemployees; public StaffObject() { employees = new HashMap (); } 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项目中实现一个访问者模式就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。