设计模式-访问者模式

简介

访问者模式是一种行为设计模式,它允许你向一个对象结构(通常是一个复杂的对象组合)添加更多操作而无需修改这些对象的类 。这种模式是通过创建一个外部的访问者类来实现的,这个类实现了对各种元素(组成对象的部分)的操作

角色

  • 访问者 (Visitor) :一个接口或抽象类,定义了对各种元素(Element)执行操作的方法。
  • 具体访问者 (Concrete Visitor):实现访问者接口的类,定义了对每种类型元素执行的具体操作。
  • 元素 (Element):接口或抽象类,定义了一个accept方法,该方法接受一个访问者对象。
  • 具体元素 (Concrete Element):实现元素接口的类,定义了元素的具体数据和accept方法的具体执行。
  • 对象结构 (Object Structure):一个集合或复合对象,包含元素对象,能枚举其元素,可能提供一个高层接口以允许访问者访问其元素。

示例实现

假设我们有一个电子商务系统,其中有多种类型的用户,我们想要对这些用户的数据执行不同的操作,例如生成报表、发送通知等。

  • 首先,定义元素和访问者接口:

    javascript 复制代码
    // 定义元素接口
    class User {
      accept(visitor) {}
    }
    
    // 定义访问者接口
    class Visitor {
      visitUser(user) {}
      visitAdmin(admin) {}
    }
    
    // 具体元素
    class RegularUser extends User {
      constructor(name) {
        super();
        this.name = name;
      }
    
      accept(visitor) {
        visitor.visitUser(this);
      }
    }
    
    class AdminUser extends User {
      constructor(name) {
        super();
        this.name = name;
      }
    
      accept(visitor) {
        visitor.visitAdmin(this);
      }
    }
  • 然后,实现具体的访问者:

    javascript 复制代码
    // 具体访问者
    class ReportVisitor extends Visitor {
      visitUser(user) {
        console.log(`Generating report for regular user: ${user.name}`);
      }
    
      visitAdmin(admin) {
        console.log(`Generating report for admin user: ${admin.name}`);
      }
    }
    
    class NotificationVisitor extends Visitor {
      visitUser(user) {
        console.log(`Sending notification to user: ${user.name}`);
      }
    
      visitAdmin(admin) {
        console.log(`Sending notification to admin: ${admin.name}`);
      }
    }
  • 最后,使用这些类:

    javascript 复制代码
    const users = [
      new RegularUser('Alice'),
      new AdminUser('Bob')
    ];
    
    const reportVisitor = new ReportVisitor();
    const notificationVisitor = new NotificationVisitor();
    
    users.forEach(user => {
      user.accept(reportVisitor);
      user.accept(notificationVisitor);
    });

总结

  • 访问者模式在 JavaScript 中可能不像在 Java 或 C# 中那样常见,因为 JavaScript 的灵活性允许我们在运行时添加或更改对象的行为。
  • 在处理复杂的对象结构,特别是当这些结构在多个不同的上下文中以不同的方式被处理时,访问者模式提供了一种清晰和可维护的方式来分离操作和对象本身。
  • 这种模式特别适合于库和框架,其中对象结构预定义,而操作则由最终用户通过访问者来定义。
相关推荐
哪 吒5 小时前
最简单的设计模式,抽象工厂模式,是否属于过度设计?
设计模式·抽象工厂模式
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
转世成为计算机大神8 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
小乖兽技术9 小时前
23种设计模式速记法
设计模式
小白不太白95010 小时前
设计模式之 外观模式
microsoft·设计模式·外观模式
小白不太白95010 小时前
设计模式之 原型模式
设计模式·原型模式
澄澈i10 小时前
设计模式学习[8]---原型模式
学习·设计模式·原型模式
小白不太白95017 小时前
设计模式之建造者模式
java·设计模式·建造者模式
菜菜-plus19 小时前
java 设计模式 模板方法模式
java·设计模式·模板方法模式
萨达大19 小时前
23种设计模式-模板方法(Template Method)设计模式
java·c++·设计模式·软考·模板方法模式·软件设计师·行为型设计模式