定义:表示一个作用于某个对象结构中的各元素的操作,使你可以在不改变个元素的类的前提下定义作用于这一系列元素的新操作。、
代码:
package visitor_model;
import java.util.ArrayList;
import java.util.List;
/**
* @author naivor
* 访问者模式-场景类
*/
public class VisitorModel {
public static void main(String[] args) {
ObjectStructure structure=new ObjectStructure();
Element elementA=new ElementA();
Element elementB=new ElementB();
structure.attach(elementA);
structure.attach(elementB);
Visitor visitor1=new Visitor1();
Visitor visitor2=new Visitor2();
structure.accept(visitor1);
structure.accept(visitor2);
}
}
/**
*
* @author naivor
* 访问者模式-访问者抽象类
*/
abstract class Visitor{
public abstract void visitElementA(ElementA elementA);
public abstract void visitElementA(ElementB elementA);
}
/**
*
* @author naivor
* 访问者模式-访问者1类
*/
class Visitor1 extends Visitor{
@Override
public void visitElementA(ElementA element) {
//访问者1访问ElementA的业务逻辑
}
@Override
public void visitElementA(ElementB element) {
//访问者1访问ElementB的业务逻辑
}
}
/**
*
* @author naivor
* 访问者模式-访问者2类
*/
class Visitor2 extends Visitor{
@Override
public void visitElementA(ElementA element) {
//访问者2访问ElementA的业务逻辑
}
@Override
public void visitElementA(ElementB element) {
//访问者2访问ElementB的业务逻辑
}
}
/**
*
* @author naivor
* 访问者模式-元素抽象类
*/
abstract class Element{
public abstract void accept(Visitor visitor);
}
/**
*
* @author naivor
* 访问者模式-元素A类
*/
class ElementA extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitElementA(this);
}
public void operate(){
//ElementA的业务逻辑
}
}
/**
*
* @author naivor
* 访问者模式-元素B类
*/
class ElementB extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitElementA(this);
}
public void operate(){
//ElementB的业务逻辑
}
}
/**
*
* @author naivor
* 访问者模式-元素管理类
*/
class ObjectStructure{
private List<Element> elements=new ArrayList<Element>();
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);
}
}
}