访问者模式目的:
封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这些操作的数据结构可以保持不变。
为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式。
访问者模式的四种角色:
1,抽象事物功能接口,定义了固定方法及可变功能方法接口;
2,具体的功能实现类;
3,访问者接口,为所有访问者对象声明一个 visit 方法,用来代表为对象结构添加的功能,原则上可以代表任意的功能;
4,具体访问者的实现类,实现要真正被添加到对象结构中的功能。
举例:(可能不太恰当,但能说明意思)“人,会哭 会笑;还有很多特性如:喜欢、讨厌等”
/**
* 人
*/
public interface Person {
/**
* 哭
*/
void cry();
/**
* 笑
*/
void smile();
/**
* 其它
*
* @param visitor
* @return
*/
Object accept(IVisitor visitor);
}
public class ChinaPerson implements Person {
String name = "";
public ChinaPerson(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void cry() {
System.out.println(name + " 哭");
}
@Override
public void smile() {
System.out.println(name + " 笑");
}
@Override
public Object accept(IVisitor visitor) {
return visitor.visit(this);
}
}
/**
* 访问者接口
*/
public interface IVisitor {
Object visit(ChinaPerson chinaPerson);
}
public class Hate implements IVisitor {
@Override
public Object visit(ChinaPerson chinaPerson) {
System.out.println(chinaPerson.getName() + " 讨厌岛国");
return null;
}
}
public class Like implements IVisitor {
@Override
public Object visit(ChinaPerson chinaPerson) {
System.out.println(chinaPerson.getName() + " 喜欢中国");
return null;
}
}
执行:
public static void main(String[] args) {
ChinaPerson chinaPerson = new ChinaPerson("中国人");
chinaPerson.cry();
chinaPerson.smile();
chinaPerson.accept(new Hate());
chinaPerson.accept(new Like());
}
结果: