设计模式-访问者模式

123 阅读1分钟

访问者模式是一种将数据结构和和数据操作分离的设计模式。当系统中存在类型数目稳定(固定)的一类数据时,可以通过访问者模式方便的实现该类型所有数据结构的不同操作,而又不会对数据产生任何副作用(脏数据) 试用场景: 1,数据结构稳定,作用于数据结构的操作经常变化的场景。 2,需要数据结构和数据操作分离的场景。 3,需要对不同数据类型(元素)操作,而不使用分支判断具体类型的场景。 直接上通用代码:

// 抽象访问者
public interface IVisitor {
    void visit(ConcreteElementA element);
    void visit(ConcreteElementB element);
}

// 具体访问者A
public class ConcreteVisitorA implements IVisitor {
    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
    }
    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
    }
}

// 具体访问者B
public class ConcreteVisitorB implements IVisitor {
    public void visit(ConcreteElementA element) {
        String result = element.operationA();
        System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
    }
    public void visit(ConcreteElementB element) {
        int result = element.operationB();
        System.out.println("result from " + element.getClass().getSimpleName() + ": " + result);
    }
}

// 抽象元素
public interface IElement {
    void accept(IVisitor visitor);
}

// 具体元素A
public class ConcreteElementA implements IElement {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
    public String operationA() {
        return this.getClass().getSimpleName();
    }
}

// 具体元素B
public class ConcreteElementB implements IElement {
    public void accept(IVisitor visitor) {
        visitor.visit(this);
    }
    public int operationB() {
        return new Random().nextInt(100);
    }
}

// 结构对象
public class ObjectStructure {
    private List<IElement> list = new ArrayList<IElement>();
    {
        this.list.add(new ConcreteElementA());
        this.list.add(new ConcreteElementB());
    }
    public void accept(IVisitor visitor) {
        for (IElement element : this.list) {
            element.accept(visitor);
        }
    }
}

public class Test {

    public static void main(String[] args) {
        ObjectStructure collection = new ObjectStructure();
        System.out.println("ConcreteVisitorA handle elements:");
        IVisitor visitorA = new ConcreteVisitorA();
        collection.accept(visitorA);
        System.out.println("------------------------------------");
        System.out.println("ConcreteVisitorB handle elements:");
        IVisitor visitorB = new ConcreteVisitorB();
        collection.accept(visitorB);
    }
    
}

##############控制台输出#############
ConcreteVisitorA handle elements:
result from ConcreteElementA: ConcreteElementA
result from ConcreteElementB: 79
------------------------------------
ConcreteVisitorB handle elements:
result from ConcreteElementA: ConcreteElementA
result from ConcreteElementB: 37

上类图: