设计模式-访问者模式

一.所用到的类

访问者模式是一个多对多的关系

1.所要被访问的类

一个公共抽象类:属性和accept方法,用来接收访问者
实现抽象类的N个类

2.访问者类

一个抽象接口 里面定义要访问N个类的方法
实现抽象接口的 N个类

二、是实现代码

所要被访问的类的抽象类

public abstract class User {
    public String name;
    public String identity; // 身份
    public String clazz;
    public User(String name, String identity, String clazz){
        this.name = name;
        this.identity = identity;
        this.clazz = clazz;
    }
    public abstract void accept(Visitor visitor);
}

所要被访问的类1

public class Student extends User{
    public Student(String name, String identity, String clazz)
    {
        super(name, identity, clazz);
    }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

所要被访问的类2

public class Teacher extends User{
    public Teacher(String name, String identity, String clazz) {
        super(name, identity, clazz);
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

访问类的接口

public interface Visitor {
    public void visit(Student student);
    public void visit(Teacher teacher);
}

访问类的实现类1

public class Parent implements Visitor{
    @Override
    public void visit(Student student) {
        System.out.println("学生" + student.name + ",老师" + student.clazz );
    }

    @Override
    public void visit(Teacher teacher) {
        System.out.println("老师" + teacher.name + ",身份" + teacher.clazz );
    }
}

访问类的实现类2

public class Principal implements Visitor{
    @Override
    public void visit(Student student) {
        System.out.println("学生" + student.name + "的学号是:" + student.identity);
    }

    @Override
    public void visit(Teacher teacher) {
        System.out.println("老师" + teacher.name + "班级:" + teacher.clazz);
    }
}

调用类

@SpringBootApplication
public class VisitorApplication {
    public static void main(String[] args) {
        User student = new Student("小王", "20250101", "一年一班");
        User teacher = new Teacher("李老师", "高级老师", "仨年一班");
        Visitor principal = new Principal();
        System.out.println("校长开始");
        student.accept(principal);
        teacher.accept(principal);
        System.out.println("\n家长开始");
        Visitor parent = new Parent();
        student.accept(parent);
        teacher.accept(parent);
    }
}

三、结果

设计模式-访问者模式_第1张图片

四、总结

所要被访问的类要向外提供一个接收访问对象的方法,然后通过创建目标对象,调用这个方法,并传入访问类的实现类

你可能感兴趣的:(设计模式,访问者模式)