设计模式行为型
访问者模式
表示一个作用于某对象结构中的各元素的操作,它使你可以不改变个元素的类的前提下定义作用于这些元素的操作。
访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接收这个操作的数据结构则可以保持不变
访问者模式适用于数据结构未定的系统,它把数据结构和作用于数据结构上的操作之间的耦合解脱开,使得操作集合可以相对的演化
角色
抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的
访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。
先看一个示例:
艺术公司利用“铜”可以设计出铜像,利用“纸”可以画出图画;造币公司利用“铜”可以印出铜币,利用“纸”可以印出纸币对“铜”和“纸”这两种元素,两个公司的处理方法不同,所以该实例用访问者模式来实现比较适合。
//抽象访问者:公司
interface Company {
String create(Paper element);
String create(Cuprum element);
}
//具体访问者:艺术公司
class ArtCompany implements Company {
public String create(Paper element) {
return "讲学图";
}
public String create(Cuprum element) {
return "朱熹铜像";
}
}
//具体访问者:造币公司
class Mint implements Company {
public String create(Paper element) {
return "纸币";
}
public String create(Cuprum element) {
return "铜币";
}
}
//抽象元素:材料
interface Material {
String accept(Company visitor);
}
//具体元素:纸
class Paper implements Material {
public String accept(Company visitor) {
return (visitor.create(this));
}
}
//具体元素:铜
class Cuprum implements Material {
public String accept(Company visitor) {
return (visitor.create(this));
}
}
//对象结构角色:材料集
class SetMaterial {
private List<Material> list = new ArrayList<Material>();
public String accept(Company visitor) {
Iterator<Material> i = list.iterator();
String tmp = "";
while (i.hasNext()) {
tmp += ((Material) i.next()).accept(visitor) + " ";
}
return tmp; //返回某公司的作品集
}
public void add(Material element) {
list.add(element);
}
public void remove(Material element) {
list.remove(element);
}
}
ps:在不改变node的结构性,将对node的操作定义在visiter中,这些操作必定是与元素类本身关系不大且是易变的操作,这样可以使不同的访问者实现不同的操作扩展。