设计模式学习(五)- 访问者模式
1.访问者模式表现形式
访问者模式,标识一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式适用于数据结构相对稳定的系统,把数据结构和作用于结构上的操作之间的耦合解脱开。
2.访问者模式UML图
3.访问者模式实例
3.1 访问者接口
public interface Visitor {
void concreteElementA(ConcreteElementA concreteElementA);
void concreteElementB(ConcreteElementB concreteElementB);
}
3.2 数据元素接口
public interface Element {
void accept(Visitor visitor);
}
3.3 数据元素实现类
public class ConcreteElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.concreteElementA(this);
}
}
public class ConcreteElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.concreteElementB(this);
}
}
3.4 访问者实现类
public class ConcreteVisitorA implements Visitor {
@Override
public void concreteElementA(ConcreteElementA concreteElementA) {
System.out.printf("%s被%s访问", concreteElementA.getClass().getName(), this.getClass().getName());
System.out.println();
}
@Override
public void concreteElementB(ConcreteElementB concreteElementB) {
System.out.printf("%s被%s访问", concreteElementB.getClass().getName(), this.getClass().getName());
System.out.println();
}
}
public class ConcreteVisitorB implements Visitor {
@Override
public void concreteElementA(ConcreteElementA concreteElementA) {
System.out.printf("%s打%s", concreteElementA.getClass().getName(), this.getClass().getName());
System.out.println();
}
@Override
public void concreteElementB(ConcreteElementB concreteElementB) {
System.out.printf("%s打%s", concreteElementB.getClass().getName(), this.getClass().getName());
System.out.println();
}
}
3.5 结构类
public class ObjectStructure {
private List<Element> elements = new LinkedList<>();
public void attach(Element element) {
elements.add(element);
}
public void detach(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
3.6 调用方法
public class TestVisitor {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new ConcreteElementA());
objectStructure.attach(new ConcreteElementB());
ConcreteVisitorA concreteVisitorA = new ConcreteVisitorA();
// ConcreteVisitorB concreteVisitorB = new ConcreteVisitorB();
objectStructure.accept(concreteVisitorA);
// objectStructure.accept(concreteVisitorB);
}
}