访问者模式中的角色:客户方、访问者、被访问者
应用场景:被访问者元素变化较小或不改变。访问者中的方法经常改变。
访问的方法都在访问者中定义。被访问者实现统一接口中的方法,具体方法委托给访问者中的方法实现。
被访问者接口:
/**
* 被访问者接口
*/
public interface Visitable {
/**
* 定义
*/
public String getDefinition(Visitor visitor);
}
被访问者(高富帅):
public class Gaofushuai implements Visitable {
private String personDefinition = "高富帅:高富帅";
@Override
public String getDefinition(Visitor visitor) {
return visitor.getGaofushuaiDefinition(this);
}
public String getPersonDefinition() {
return personDefinition;
}
public void setPersonDefinition(String personDefinition) {
this.personDefinition = personDefinition;
}
}
被访问者(屌丝):
public class Diaosi implements Visitable{
private String personDefinition = "屌丝:穷矮矬";
@Override
public String getDefinition(Visitor visitor) {
return visitor.getDiaosiDefinition(this);
}
public String getPersonDefinition() {
return personDefinition;
}
public void setPersonDefinition(String personDefinition) {
this.personDefinition = personDefinition;
}
}
访问者接口:
/**
* 访问者
*/
public interface Visitor {
/*
* 屌丝定义
*/
public String getDiaosiDefinition(Diaosi diaosi);
/*
* 高富帅定义
*/
public String getGaofushuaiDefinition(Gaofushuai gaofushuai);
}
访问者接口实现(人员访问者):
public class PersonVisitor implements Visitor {
public void visitPerson(List<Visitable> list){
Iterator it = list.iterator();
while (it.hasNext()) {
Visitable visitable = (Visitable)it.next();
System.out.println(visitable.getDefinition(this));
}
}
@Override
public String getDiaosiDefinition(Diaosi diaosi) {
return diaosi.getPersonDefinition();
}
@Override
public String getGaofushuaiDefinition(Gaofushuai gaofushuai) {
return gaofushuai.getPersonDefinition();
}
}
客户端访问:
public class VisitorClient {
public static void main(String[] args) {
List<Visitable> list = new ArrayList<Visitable>();
list.add(new Diaosi());
list.add(new Gaofushuai());
new PersonVisitor().visitPerson(list);
}
}
访问结果:
屌丝:穷矮矬
高富帅:高富帅