JAVA设计模式之访问者模式原理与用法详解
本文实例讲述了JAVA设计模式之访问者模式。分享给大家供大家参考,具体如下:
访问者模式:
一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。
结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。
适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。
优点:
1、符合单一职责原则
2、扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。
缺点:
1、如果要增加新元素,则会让操作变得更复杂
2、在一定程序上破坏了封装性原则
访问者械五大角色对象:
1.Visitor抽象访问者角色
2.ConcreteVisitor.具体访问者角色
3.Element接受访问操作元素
4.ConcreteElement具体元素
5.ObjectStructure结构对象角色,这是使用访问者模式必备的角色。
/**
*抽象访问者:为该对象结构中具体元素角色声明一个访问操作接口。
*该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,
*这样访问者就可以通过该元素角色的特定接口直接访问它。
*@description:
*@date2016-1-15下午4:00:29
*/
publicinterfaceVisitor{
voidvisit(Elementelement);
}
/**
*具体访问者角色,实现Visitor声明的接口。
*@description:
*@date2016-1-15下午4:20:46
*/
publicclassConcreteVisitorimplementsVisitor{
@Override
publicvoidvisit(Elementelement){
Staffe=(Staff)element;
//比如:加薪的计算方式:职位*加薪系数+工龄*对应系统之和除以10再乘以现在工资
System.out.println(e.getName()+"要加的薪水是:"+(e.getDegree()*0.8+e.getWorkAges()*0.5)/10*e.getSalary());//
}
}
/**
*定义一个接受访问操作类,访问者(Visitor)操作函数的参数。
*@description:
*@date2016-1-15下午3:58:28
*/
publicabstractclassElement{
publicabstractvoidAcceppt(Visitorvisitor);
}
/**
*具体元素,实现了抽象元素(Element)所定义的接受操作接口。
*@description:
*@date2016-1-15下午4:04:24
*/
publicclassStaffextendsElement{
privateStringname;
privatefloatsalary;
privateintworkAges;
privateintdegree;
publicStaff(Stringname,floatsalary,intworkAges,intdegree){
super();
this.name=name;
this.salary=salary;
this.workAges=workAges;
this.degree=degree;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicfloatgetSalary(){
returnsalary;
}
publicvoidsetSalary(floatsalary){
this.salary=salary;
}
publicintgetWorkAges(){
returnworkAges;
}
publicvoidsetWorkAges(intworkAges){
this.workAges=workAges;
}
publicintgetDegree(){
returndegree;
}
publicvoidsetDegree(intdegree){
this.degree=degree;
}
@Override
publicvoidAcceppt(Visitorvisitor){
visitor.visit(this);
}
}
/**
*结构对象:这是使用访问者模式必备的角色。
*它具备以下特性:
*能枚举它的元素;
*可以提供一个高层接口以允许访问者访问它的元素;
*如有需要,可以设计成一个复合对象或者一个聚集(如一个列表或无序集合)。
*@description:
*@date2016-1-15下午4:26:30
*/
publicclassStaffObject{
privateHashMapemployees;
publicStaffObject(){
employees=newHashMap();
}
publicvoidaddEmployee(Staffe){
if(!employees.containsKey(e.getName())){
employees.put(e.getName(),e);
}
}
publicvoidremoveEmployee(Staffe){
if(employees.containsKey(e.getName())){
employees.remove(e);
}
}
publicStaffgetEmployee(Stringname){
returnemployees.get(name);
}
publicvoidAccept(Visitorv){
for(Staffe:employees.values()){
e.Acceppt(v);
}
}
}
测试类
publicclassTest{
publicstaticvoidmain(String[]args){
StaffObjecte=newStaffObject();
e.addEmployee(newStaff("张三",3000f,2,1));
e.addEmployee(newStaff("李四",5000f,4,2));
e.addEmployee(newStaff("王五",8000f,6,3));
e.addEmployee(newStaff("沈七",10000f,9,4));
e.Accept(newConcreteVisitor());
}
}
运行结果:
李四要加的薪水是:1800.0 张三要加的薪水是:540.0 沈七要加的薪水是:7700.0 王五要加的薪水是:4320.0
更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。