概述
- 定义:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作
- 适用场景:
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作“污染”这些对象的类,也不希望在增加新操作时修改这些类
实现
// 商品接口
public interface Goods {
int accept(Visitor visitor);
}
class Basketball implements Goods {
private int price;
public Basketball(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
class Fruit implements Goods {
private int price;
public Fruit(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
// 访问者接口
public interface Visitor {
int visit(Basketball basketball);
int visit(Fruit fruit);
}
class VisitorImpl implements Visitor {
@Override
public int visit(Basketball basketball) {
System.out.println(basketball + " , " + basketball.getPrice());
return basketball.getPrice();
}
@Override
public int visit(Fruit fruit) {
System.out.println(fruit + " , " + fruit.getPrice());
return fruit.getPrice();
}
}
// 客户端
public class Client {
public static void main(String[] args) throws Exception {
Goods[] gs = new Goods[] { new Basketball(3), new Basketball(6), new Fruit(2) };
Visitor v = new VisitorImpl();
int sum = 0;
// 计算商品总价格
for(Goods g : gs) {
sum += g.accept(v);
}
System.out.println("total: " + sum);
}
}
访问者模式将元素类中与元素类本身关系不大且易变的操作移到访问者类中,使得元素类的职责更单一,同时若想改变操作逻辑,只需要改变访问者即可