拜访者形式相对来说比较笼统和难以了解,能够单纯地经过文字、类图、案例代码大家还是不太容易了解该形式,不过希望大家不要耐心,可以静下心来用心的体会该设计形式的魅力。置信你一定会有所播种。
基本引见拜访者形式的基本概念:封装一些作用于某种数据结构中元素上的操作。其有一个重要的特征是可以在不改动数据结构的前提下定义一些新的操作。
复杂来说拜访者形式主要的作用就是将“数据结构”和“数据操作”停止别离,处置这两者之间耦合性的成绩。
拜访者形式的基本执行原理就是在被拜访的类里添加一个接口,用于接待拜访者。
普通数状况下,当我们需求对一个数据结构中的元素停止很多不同的操作,并且这些操作彼此之间并没有关联,同时我们还想做到避免由于这些操作而“污染”了这些元素时,就可思索运用拜访者形式。
拜访者形式UML类图类图解说
Visitor:笼统拜访角色;通常状况下该数据结构中有几个元素就会对应的在该类中为每一个元素提供一个拜访操作(办法)。
ConcreteVisitor:详细拜访者角色;承袭了Visitor并完成了其中定义的所以办法。
Element:笼统元素角色;该类会定义一个accept(接纳)办法,用于接纳拜访者。
ConcreteElement:详细元素角色;承袭了Element并完成了其中定义的accept办法。
ObjectStruture:该类定义了数据结构(对象结构),管理了一切元素,并且可以枚举它的元素(也就是遍历)。
案例:开发一个员工审批功用,详细为不同角色的员工可以停止“赞同”和“不赞同”的审批。
笼统员工类 => 对应Element(笼统元素角色)
public abstract class Workers {
// 提供一个让拜访者拜访的办法
public abstract void accept(Action action);
}
详细员工类
/**
* 经理
*/
public class Manager extends Workers {
/**
* 这里用到了双分派。
* 第一次分派:在客户端中将详细的Action作为参数传递到Manager中。
* 第二次分派:Manager类调用Action中的详细办法,并将本人作为参数传入。
*/
@Override
public void accept(Action action) {
action.managerVerify(this);
}
}
/**
* 组长
*/
public class GroupLeader extends Workers {
@Override
public void accept(Action action) {
action.groupLeaderVerify(this);
}
}
笼统行为类 => 对应Visitor(笼统拜访角色)
public abstract class Action {
// 经理停止审批
public abstract void managerVerify(Manager manager);
// 组长停止审批
public abstract void groupLeaderVerify(GroupLeader groupLeader);
}
详细行为类
/**
* 赞同
*/
public class Agree extends Action {
@Override
public void managerVerify(Manager manager) {
System.out.println("经理的审核结果为赞同!");
}
@Override
public void groupLeaderVerify(GroupLeader groupLeader) {
System.out.println("组长的审核结果为赞同!");
}
}
/**
* 不赞同
*/
public class Disagree extends Action {
@Override
public void managerVerify(Manager manager) {
System.out.println("经理的审核结果为不赞同!");
}
@Override
public void groupLeaderVerify(GroupLeader groupLeader) {
System.out.println("组长的审核结果为不赞同!");
}
}
ObjectStructure类
public class ObjectStructure {
// 维护了一个集合
private List<Workers> peoples = new ArrayList<>();
// 添加
public void attach(Workers workers) {
peoples.add(workers);
}
// 移除
public void detach(Workers workers) {
peoples.remove(workers);
}
// 显示测评状况
public void display(Action action) {
for (Workers people : peoples) {
people.accept(action);
}
}
}
客户端测试类
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
// 添加人
objectStructure.attach(new Manager());
objectStructure.attach(new GroupLeader());
// 赞同
Agree agree = new Agree();
objectStructure.display(agree);
}
}
执行结果
(责任编辑:admin)