访问者模式(Visitor Pattern)

即根据访问者不同,所展示的行为也不同。

访问者模式的实例

首先我们定义一组设备

  1. class Keyboard {
  2. accept(computerPartVisitor) {
  3. computerPartVisitor.visit(this);
  4. }
  5. }
  6. class Monitor {
  7. accept(computerPartVisitor) {
  8. computerPartVisitor.visit(this);
  9. }
  10. }
  11. class Mouse {
  12. accept(computerPartVisitor) {
  13. computerPartVisitor.visit(this);
  14. }
  15. }

定义电脑为一种设备,同时集成了其它设备

  1. class Computer {
  2. constructor(){
  3. this.parts = [new Mouse(), new Keyboard(), new Monitor()];
  4. }
  5. accept(computerPartVisitor) {
  6. for (let i = 0; i < this.parts.length; i++) {
  7. this.parts[i].accept(computerPartVisitor);
  8. }
  9. computerPartVisitor.visit(this);
  10. }
  11. }

定义访问者接口

  1. class ComputerPartDisplayVisitor{
  2. visit(device) {
  3. console.log(`Displaying ${device.constructor.name}.`);
  4. }
  5. }

在使用的时候都只需要用设备接受新的访问者即可实现对应访问者的功能

  1. const computer = new Computer();
  2. computer.accept(new ComputerPartDisplayVisitor());
  3. /**
  4. * output:
  5. * Displaying Mouse.
  6. * Displaying Keyboard.
  7. * Displaying Monitor.
  8. * Displaying Computer.
  9. */

访问者模式的优势

如上类似设备这个东西是一个相对稳定的结构,而访问者要实现的功能又是非常不确定的,那么针对不同访问者,都可以对相同的设备进行不同的输出。其次只需要暴露特定接口,而相对稳定的设备不需要考虑接口中实现的内容。

上一页(模板模式)