技术栈

2019-03-03——设计模式 访问者模式

2019-03-03  本文已影响0人  烟雨乱平生

特点

在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。为不同类型的元素提供多种访问操作方式,且可以在不修改原有系统的情况下增加新的操作方式。同时我们还需要明确一点那就是访问者模式是适用于那些数据结构比较稳定的,因为他是将数据的操作与数据结构进行分离了,如果某个系统的数据结构相对稳定,但是操作算法易于变化的话,就比较适用适用访问者模式,因为访问者模式使得算法操作的增加变得比较简单了。

主要角色

实现

public interface Element {
    void accept(Visitor visitor);
}

public class ElementA implements Element{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void opA(){
        System.out.println("this is A");
    }
}


public class ElementB implements Element{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    public void opB(){
        System.out.println("this is B");
    }
}


public interface Visitor {
    void visit(ElementA element);
    void visit(ElementB element);
}


public class VisitorA implements Visitor{
    @Override
    public void visit(ElementA element) {
        element.opA();
    }

    @Override
    public void visit(ElementB element) {
        element.opB();
    }
}



public class VisitorB implements Visitor{
    @Override
    public void visit(ElementA element) {
        element.opA();
    }

    @Override
    public void visit(ElementB element) {
        element.opB();
    }
}


public class ObjectStructure {
    private List<Element> elements = new ArrayList<>();
    public void add(Element element){
        elements.add(element);
    }

    public void accept(Visitor visitor){
        for (Element element : elements){
            element.accept(visitor);
        }
    }

    public void remove(Element element){
        this.elements.remove(element);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读