JAVA设计模式之:访问者模式
2016-01-15 16:49
453 查看
访问者模式:
一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。
结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。
适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。
优点:
1、符合单一职责原则
2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。
缺点:
1、如果要增加新元素,则会让操作变得更复杂
2、在一定程序上破坏了封装性原则
*
访问者械五大角色对象:
1.Visitor 抽象访问者角色
2.ConcreteVisitor.具体访问者角色
3.Element 接受访问操作元素
4.ConcreteElement 具体元素
5.ObjectStructure 结构对象角色,这是使用访问者模式必备的角色。
测试类
运行结果:
李四要加的薪水是:1800.0
张三要加的薪水是:540.0
沈七要加的薪水是:7700.0
王五要加的薪水是:4320.0
一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。
结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。
适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。
优点:
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中抽象类和接口的区别
- JavaWeb 服务启动时,在后台启动加载一个线程。
- JAB(java access bridge)学习和使用
- Eclipse导入MyEclipse工程(web项目显示为java项目解决办法)
- Spring transaction事务之roll back回滚
- javaweb中ajax跨域访问实例
- Java:util.Date与sql.Date的区别和转化
- java(12)--xml之sax方式解析文档
- gradle--java入门(转)
- Java设计模式——模板方法设计模式——抽象类的运用
- Java利用MessageDigest获取字符串或文件MD5详解
- Java基于TCP方式的二进制文件传输
- java math 常用函数【自己留存】
- 分别用Eclipse和IDEA搭建Scala+Spark开发环境
- 在web工程中使用Spring依赖注入
- java 的 AccessController.doPrivileged使用
- java remote debug
- Spring4.0学习笔记002——Spring应用初识
- spring加载时机的一些理解
- Bonecp spring配置数据源