访问者模式(Visitor Pattern)是一种将算法与对象结构分离的设计模式。这种模式中,可以在不修改已有程序结构的前提下,通过添加额外的“访问者”来定义作用于对象结构中各元素的新操作。它主要解决的是稳定的数据结构和易变的操作耦合问题。
假设有一个电子商务系统,需要对不同类型的用户(如普通用户和VIP用户)进行不同的促销活动。
访问者接口和具体的访问者实现:
interface Visitor {
void visit(NormalUser user);
void visit(VIPUser user);
}
class PromotionVisitor implements Visitor {
@Override
public void visit(NormalUser user) {
System.out.println("给普通用户发送优惠券");
}
@Override
public void visit(VIPUser user) {
System.out.println("给VIP用户发送优惠券和积分");
}
}
用户类和接受访问的接口:
interface User {
void accept(Visitor visitor);
}
class NormalUser implements User {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
class VIPUser implements User {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
客户端代码:
public class Client {
public static void main(String[] args) {
List<User> users = Arrays.asList(new NormalUser(), new VIPUser());
Visitor promotion = new PromotionVisitor();
for (User user : users) {
user.accept(promotion);
}
}
}
当对象结构非常稳定,几乎不会新增元素类型,同时操作经常变化时,使用访问者模式是合适的。如果对象结构经常变化,则每次新增类型都需要修改访问者接口和所有实现类,这违背了开闭原则,此时应考虑其他设计模式。
访问者模式适用于对象结构相对稳定,而操作易变的场景。它使得增加新操作变得简单,但增加新的元素类较为复杂。在使用访问者模式时,应该权衡其带来的灵活性和可能的复杂性。在对象结构频繁变化的场景下,应考虑其他设计模式。