访问者模式

发布时间 2023-11-13 17:44:05作者: 做时间的好朋友

访问者模式

1.说明

同一个事物的不同视角下访问信息的不同

家长视角下的老师-》教学质量怎么样
家长视角下的学生-》分数好不好

校长视角下的老师-》老没有被投诉
校长视角下的学生-》是不是三好学生

2.抽象代码结构

2.1 抽象角色,老师,学生

User.java

@NoArgsConstructor
@AllArgsConstructor
@Data
public abstract class User {
    protected String name; // 姓名
    protected String identity; // 身份
    protected String clazz; // 班级

    public abstract void accept(Visitor visitor);
}

Student.java

@Data
@NoArgsConstructor
public class Student extends User{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

Teacher.java

@NoArgsConstructor
@Data
public class Teacher extends User{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

2.2 角色的说明

identity:老师角色是普通教师,特级教师;学生是重点班还是普通班
clazz:班级
核心是accept的抽象方法里参数是视角Visitor对象。并且角色实现方法里,把自身传递进去

2.3 视角的定义

Visitor.java

public interface Visitor {
    void visit(Student student);

    void visit(Teacher teacher);
}

定义了重载方法,入参类型不一致。这个是关键

家长视图ParentVisitor.java

@Slf4j
public class ParentVisitor implements Visitor{

    public void visit(Student student) {
        log.info("student visit ...");
    }

    @Override
    public void visit(Teacher teacher) {
        log.info("teacher visit ...");
    }
}

3.测试类说明

ViewMain.java

public class ViewMain {
    public static void main(String[] args) {
        Visitor visitor = new ParentVisitor(); // 定义家长视角
        Student student = new Student();
        student.setName("hby");
        student.setClazz("三年二班");
        student.setIdentity("重点班");
        student.accept(visitor); // 学生调用accept把视角传递进去
    }
}

4.优缺点

优点:工程结构更容易添加和修改。做到了系统服务的解耦,代码更清晰

缺点:抽象类的抽象方法时候还需要接受访问者接口的参数传递。该设计会让代码变得组织难度加大。违背了米特原则。最少知道原则。
一定要符合场景的运用,以及提取这部分设计思想的精髓才是重中之重。