您的位置:首页 > 编程语言 > Java开发

JAVA设计模式之:访问者模式

2016-01-15 16:49 453 查看
访问者模式:

一个作用于某对象结构中各元素的操作,使你可以在不改变各元素类数据结构的前提下增加作用于这些元素的新操作。

结构对象是访问者模式必备条件,且这个结构对象必须存在遍历自身各个对象的方法。

适用于:数据结构相对稳定,把数据结构和作用与其上的其它操作解耦,使得操作相对自由。

优点:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: