访问者模式

本文共--字 阅读约--分钟 | 浏览: -- 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();