在访问者模式中,通常包含以下角色:
1. 元素(Element): 定义一个 accept 方法,该方法接受访问者作为参数,使得访问者能够访问元素。
public interface Element {
void accept(Visitor visitor);
}
2. 具体元素(ConcreteElement): 实现了元素接口,提供了具体的 accept 方法。
public class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
}
public class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
}
3. 访问者(Visitor): 定义了一系列的访问方法,分别对应不同类型的元素。
public interface Visitor {
void visitConcreteElementA(ConcreteElementA elementA);
void visitConcreteElementB(ConcreteElementB elementB);
}
4. 具体访问者(ConcreteVisitor): 实现了访问者接口,提供了对不同类型元素的具体访问操作。
public class ConcreteVisitor implements Visitor {
@Override
public void visitConcreteElementA(ConcreteElementA elementA) {
System.out.println("Visitor visits ConcreteElementA");
}
@Override
public void visitConcreteElementB(ConcreteElementB elementB) {
System.out.println("Visitor visits ConcreteElementB");
}
}
5. 客户端代码: 创建元素对象和访问者对象,通过元素的 accept 方法调用访问者的相应方法。
public class Client {
public static void main(String[] args) {
Element elementA = new ConcreteElementA();
Element elementB = new ConcreteElementB();
Visitor visitor = new ConcreteVisitor();
elementA.accept(visitor);
elementB.accept(visitor);
}
}
在这个例子中,Element 接口定义了 accept 方法,用于接受访问者对象。ConcreteElementA 和 ConcreteElementB 是具体元素类,分别实现了 accept 方法,将自身传递给访问者。Visitor 接口定义了对不同类型元素的访问方法,而 ConcreteVisitor 是具体访问者类,实现了对具体元素的访问操作。
访问者模式的优势在于可以轻松添加新的操作,同时不需要修改现有的元素类。这样的设计使得系统更加灵活,容易扩展。然而,访问者模式也会导致访问者类的数量增加,可能使得系统复杂度增加。因此,在使用访问者模式时需要权衡灵活性和复杂性。
转载请注明出处:http://www.zyzy.cn/article/detail/13961/设计模式