訪問者模式
訪問者模式UML.png
例子以公司招聘查看簡歷為背景
interface Visitor{
void visitClerical(Clerical clerical);//查看文員簡歷
void visitCoder(Coder coder);//查看程序員簡歷
}
訪問者接口,分別對ElementA與ElementB進行訪問
class HRVisitor{
public void visitClerical(Clerical clerical){
//HR關注文員簡歷XXXXX
}
public void visitCoder(Coder coder){
//HR看碼農簡歷,看經驗看學校
}
}
HR訪問者
class CTOVisitor{
public void visitClerical(Clerical clerical){
//CTO不關心文員簡歷,可是是空實現
}
public void visitCoder(Coder coder){
//CTO看碼農簡歷,看項目 看技能
}
}
CTO訪問者
abstract class JobSeeker{
public String name;
public String school;
public String skill;
public JobSeeker(String name ,String school ,String skill){
this.name = name;
this.school = school;
this.skill = skill;
}
public abstract void accept(Visitor visitor);
}
抽象求職者類
class Clerical extends JobSeeker{
public Clerical(String name ,String school ,String skill){
super(name , school , skill);
}
public void accept(Visitor visitor){
visitor.visitClerical(this);
}
}
文員求職者
class Coder extends JobSeeker{
public Coder(String name ,String school ,String skill){
super(name , school , skill);
}
public void accept(Visitor visitor){
visitor.visitCoder(this);
}
}
碼農求職者
public class JobStructure{
List<JobSeeker> list = new ArrayList<>();
public void seeResume(Visitor visitor){
for(JobSeeker jobSeeker : list){
jobSeeker.accept(visitor);
}
}
public void addJobSeeker(JobSeeker jobSeeker){
list.add(jobSeeker);
}
}
查閱簡歷類
class CLient{
public static void main(String[] args){
JobStructure jobStructure = new JobStructure();
jobStructure.addJobSeeker(new Coder("小強","清華","Android"));
jobStructure.addJobSeeker(new Coder("小民","北大","Word"));
jobStructure.seeResume(new CTOVisitor());
jobStructure.seeResume(new HRVisitor());
}
}
客戶端類,收集簡歷,CTO查看簡歷,HR查看簡歷