JAVA设计模式笔记(访问者模式)

访问者模式,是行为型设计模式之一。访问者模式封装一些作用于某种数据结构各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素新的操作。访问者模式主要将数据操作和数据结构分离,解决数据结构和操作耦合性的问题。
访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。

类图:
在这里插入图片描述
访问者模式的角色和职责:
(1)Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类族要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。
(2)ConcreteVisitor:具体访问者,它需要给出对每一个元素类访问时所产生的具体行为。
(3)Element:元素接口或者抽象类,它定义了一个接受访问者的方法(Accept),其意义是指每一个元素都要可以被访问者访问。
(4)ConcreteElement:具体的元素类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
(5)ObjectStructure:对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。

访问者

public abstract class Visitor {
    public abstract void visitElement1(Element1 element1);
    public abstract void visitElement2(Element2 element2);
}

具体访问者

public class Visitor1 extends Visitor {

    @Override
    public void visitElement1(Element1 element1) {
        System.out.println("访问元素1");
    }
    @Override
    public void visitElement2(Element2 element2) {
        System.out.println("访问元素2");
    }
}

元素类

public abstract class Element {
    abstract void accept(Visitor action);
}

具体元素类

public class Element1 extends Element {

    @Override
    void accept(Visitor visitor) {
        visitor.visitElement1(this);
    }
}
public class Element2 extends Element {
    @Override
    void accept(Visitor visitor) {
        visitor.visitElement2(this);
    }
}

数据结构类

public class ObjectStruct {
    private List<Element> elementList=new LinkedList<>();

    public void add(Element p){
        elementList.add(p);
    }
    public void delete(Element p){
        elementList.remove(p);
    }
    public void display(Visitor visitor){
        for(Element e:elementList){
            e.accept(visitor);
        }
    }
}

客户端调用

public class Client {
    public static void main(String[] args) {
        ObjectStruct objectStruct=new ObjectStruct();
        objectStruct.add(new Element1());
        objectStruct.add(new Element2());
        Visitor visitor=new Visitor1();
        objectStruct.display(visitor);
    }
}

发布了56 篇原创文章 · 获赞 3 · 访问量 1617

猜你喜欢

转载自blog.csdn.net/qq_20786911/article/details/103747354