访问者模式是将对数据的操作和数据结构进行分离,将对数据中个元素的操作封装成独立的类,使其在不改变数据结构的前提下可以拓展对数据新的操作
这个模式有点像看文章小说,不同的人收获到的心情是不一样的,就是在类的封装又添加了访问者的封装,对不同的访问者访问类结构的属性返回不一样的逻辑结果
例如做项目,需求文档,项目经理访问需求文档的是想了解项目边界,开发人员访问需求文档的是想知道有哪些功能开发、难点和重点,测试人员访问需求文档是想评估测试用例多少。不同的立场返回项目的信息会不同,但是需求文档结构还是那个需求文档
class DocumentReader {
constructor(name) {
this.name = name;
}
access() {
const documentVisitor = new DocumentVisitor();
console.log(this.name, ' readComplate:', documentVisitor.readComplate(this))
}
}
// 前端开发
class WebDevelopers extends DocumentReader {
constructor(name) {
super(name);
}
}
// 项目经理
class Manager extends DocumentReader {
constructor(name) {
super(name)
}
}
// 测试人员
class Tester extends DocumentReader {
constructor(name) {
super(name);
}
}
class DocumentVisitor {
readComplate(visitor) {
if (visitor.constructor === Manager) {
return {
beginTime:'2021-01-01',
endTime:'2022-01-01',
functions:'用户登录,验证码',
developmentTime:'2021-01-05~2020-06-30',
testTime:'2020-07-01~2020-12-01'
}
}
else if (visitor.constructor === WebDevelopers) {
return {
functions:'用户登录页面开发',
difficulty:'html + js + css'
}
}
else if (visitor.constructor === Tester) {
return {
functions: '100个测试用例'
}
}
}
const webDevelopers = new WebDevelopers('爱钱的大厦韩');
webDevelopers.access()
const manager = new Manager('牛总');
manager.access();
const tester = new Tester('陈sir');
tester.access();
访问者模式就如上面,写完了,就是同一个数据结构,因不同的对象所得到的结构会不同。它保留了原数据结构的完整性,但是添加了访问者的封装逻辑,但是如果进行对象扩张,访问者的逻辑也需要进行扩展,当然访问者也可以使用其他设计模式来进行代码的封装,例如状态设计模式