访问模式是一种比较少用到的模式,但是一旦你使用访问模式,往往你就真的需要使用访问模式。访问模式具有独特的灵活性。
访问模式是结构比较复杂的设计模式。
访问模式,是封装一些用于某种数据结构的各元素的操作, 它可以在不改变这些数据结构的前提下,定义作用于这些元素的新的操作。
1 创建访问接口
package visitorpattern;
public interface Visitor {
void visit(Engineer engineer);
void visit(Manager manager);
}
2 创建被访问对象
package visitorpattern;
import java.util.Random;
/**
* 数据结构的抽象类
* @author Administion
*
*/
public abstract class Staff {
public String name;
public int kpi;
public Staff(String name) {
this.name = name;
kpi = new Random().nextInt(10);
}
public abstract void accept(Visitor visitor);
}
3 创建具体的被访问实体类
创建Engineer类
package visitorpattern;
import java.util.Random;
public class Engineer extends Staff{
public Engineer(String name) {
super(name);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public int getCodeLines(){
return new Random().nextInt(10 * 10000);
}
}
和 Manager类
package visitorpattern;
import java.util.Random;
public class Manager extends Staff{
private int products;
public Manager(String name) {
super(name);
products = new Random().nextInt(10);
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public int getProducts(){
return products;
}
}
4 创建实体的访问者
package visitorpattern;
/**
* 操作数据
*/
public class CEOVisitor implements Visitor{
@Override
public void visit(Engineer engineer) {
System.out.println("Engineer: "+engineer.getCodeLines()+"---KPI : "+engineer.kpi);
}
@Override
public void visit(Manager manager) {
System.out.println("Manager: "+manager.getProducts()+"---KPI : "+manager.kpi);
}
}
5 创建对访问数据的操作类,访问过程不改变数据本身
package visitorpattern;
import java.util.ArrayList;
import java.util.List;
public class BusinessReport {
private List<Staff> mStaff = new ArrayList<>();
public BusinessReport( ) {
mStaff.add(new Engineer("违法和"));
mStaff.add(new Engineer("违红人馆和"));
mStaff.add(new Engineer("戈贝尔"));
mStaff.add(new Manager("未额头"));
}
public void showReport(Visitor visitor) {
for (Staff staff : mStaff) {
staff.accept(visitor);
}
}
}
5 测试访问数据的结果
通过操作类访问数据
package visitorpattern;
public class Client {
public static void main(String[] args) {
BusinessReport report = new BusinessReport();
report.showReport(new CEOVisitor());
}
}