1.定义:
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
2.UML类图:
3.简单代码实现:
//定义对元素进行操作的抽象类
package com.guo.visitorPattern;
public abstract class Visitor {
abstract void visitConcreteElementA(ConcreteElementA concreteElementA);
abstract void visitConcreteElementB(ConcreteElementB concreteElementB);
}
package com.guo.visitorPattern;
public class ConcreteVisitor1 extends Visitor {
@Override
void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println("成功的男人背后都有一个成功的女人。。。。。。");
}
@Override
void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println("成功的女人背后都有一个失败的男人。。。。。。");
}
}
package com.guo.visitorPattern;
public class ConcreteVisitor2 extends Visitor {
@Override
void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println("男人失败了。。。抽烟喝酒");
}
@Override
void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println("女人失败了。。。嘤嘤嗡嗡");
}
}
//定义元素的抽象类
package com.guo.visitorPattern;
public abstract class Element {
abstract void accept(Visitor visitor);
}
package com.guo.visitorPattern;
public class ConcreteElementA extends Element {
@Override
void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
}
package com.guo.visitorPattern;
public class ConcreteElementB extends Element {
@Override
void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
}
package com.guo.visitorPattern;
import java.util.ArrayList;
import java.util.List;
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void attach(Element element){
elements.add(element);
}
public void detach(Element element){
elements.remove(element);
}
public void accept(Visitor visitor){
for (Element e : elements) {
e.accept(visitor);
}
}
}
package com.guo.visitorPattern;
public class VisitorClient {
public static void main(String[] args) {
ObjectStructure obj = new ObjectStructure();
obj.attach(new ConcreteElementA());
obj.attach(new ConcreteElementB());
//成功时的反应
Visitor visitor1 = new ConcreteVisitor1();
obj.accept(visitor1);
//失败时的反应
Visitor visitor2 = new ConcreteVisitor2();
obj.accept(visitor2);
}
}
4.使用场景和优缺点: