訪問模式是一種比較少用到的模式,但是一旦你使用訪問模式,往往你就真的需要使用訪問模式。訪問模式具有獨特的靈活性。
訪問模式是結構比較複雜的設計模式。
訪問模式,是封裝一些用於某種數據結構的各元素的操作, 它可以在不改變這些數據結構的前提下,定義作用於這些元素的新的操作。
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());
}
}