主要将数据结构与数据操作分离
主要解决:稳定的数据结构和易变的操作耦合问题。
何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作”污染”这些对象的类,使用访问者模式将这些封装到类中。
如何解决:在被访问的类里面加一个对外提供接待访问者的接口。
案例
比如老师家访学生,不同科目的老师就是访问者,通过学生的描述,老师对同一个学生做出一个判断
// 元素类
class Student {
constructor(name, chinese, math, english) {
this.name = name
this.chinese = chinese
this.math = math
this.english = english
}
accept(visitor) {
visitor.visit(this)
}
}
// 访问者类
class ChineseTeacher {
visit(student) {
console.log(`语文${student.chinese}`)
}
}
class MathTeacher {
visit(student) {
console.log(`数学${student.math}`)
}
}
class EnglishTeacher {
visit(student) {
console.log(`英语${student.english}`)
}
}
// 实例化元素类
const student = new Student('张三', 90, 80, 60)
// 实例化访问者类
const chineseTeacher = new ChineseTeacher()
const mathTeacher = new MathTeacher()
const englishTeacher = new EnglishTeacher()
// 接受访问
student.accept(chineseTeacher)
student.accept(mathTeacher)
student.accept(englishTeacher)