本文共--字 阅读约--分钟 | 浏览: -- Last Updated: 2021-12-15
访问者模式(Visitor):针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法。
访问者模式就是同一个数据结构,因不同的对象访问所得到的结构会不同。它保留了原数据结构的完整性,但是添加了访问者的封装逻辑,但是如果进行对象扩展,访问者的逻辑也需要进行扩展。因此访问者适合于那些数据稳定,但是数据的操作方法易变的环境下。因为当操作环境改变时,可以自由修改操作方法以适应操作环境,而不用修改原数据,实现操作方法的拓展。同时对于同一个数据,它可以被多个访问对象访问,这极大增加了操作数据的灵活性。
参考:参考1
/**
* 例如做项目,需求文档
* 项目经理访问需求文档的是想了解项目进展
* 开发人员访问需求文档的是想知道有哪些功能需要开发、难点与重点
* 测试人员访问需求文档是想评估测试用例多少。
* 不同的立场返回项目的信息会不同,但是需求文档结构还是原来的完整性。
* */
class DocumentReader {
constructor(name) {
this.name = name;
}
access() {
const documentVisitor = new DocumentVisitor();
console.log(this.name, 'read', documentVisitor.read(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 {
read (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('测试人员');
tester.access();