访问者模式
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.优缺点
优点:工程结构更容易添加和修改。做到了系统服务的解耦,代码更清晰
缺点:抽象类的抽象方法时候还需要接受访问者接口的参数传递。该设计会让代码变得组织难度加大。违背了米特原则。最少知道原则。
一定要符合场景的运用,以及提取这部分设计思想的精髓才是重中之重。