最近在学习如何写一个 babel-plugin 的时候,发现 babel 在设计插件系统的时候,使用了 visitor pattern,遂学习了一下此模式,记录于此。
表示要在具有对象结构的元素上进行的操作。Visitor 能保证在不改变被操作元素的类的时候同时对元素进行新的操作。
使用频率(in Javascript): low
访问者模式在不改变集合中对象的时候同时为对象集合定义新的操作。新的逻辑定义在一个叫做 Visitor 的单独对象中。
访问者模式在构建库或者框架的可拓展性的时候非常有用。如果你项目中的对象向外暴露 ‘visit’ 方法,这个方法可以接收一个用于修改当前对象的Visitor Object。那么实际上你已经为client实现了创建未来拓展的方法。
在大多数的编程语言中,访问者模式要求开发者预期未来将会出现的功能调整。这是通过在类中增加可以接受 Visitor 的方法来完成的。
此模式中包含:
accept
方法accept
方法中,使用 this
来调用 Visitor 的 visit
方法visit
方法。参数是被访问的元素。这里也是实现元素变化的地方在接下来的栗子中,我们创建三个员工,每一个员工都将获得10%的涨薪和2天的额外假期。我们使用访问者模式来实现此功能。
1 | var Employee = function (name, salary, vacation) { |
上面的代码中,每一个员工都有一个相应的访问者对象用来操作员工对象。
visitor-design-pattern
how-to-implement-visitor-pattern-in-javascript
访问者模式