设计模式-访问者模式

简介

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

角色

  • 访问者 (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 的灵活性允许我们在运行时添加或更改对象的行为。
  • 在处理复杂的对象结构,特别是当这些结构在多个不同的上下文中以不同的方式被处理时,访问者模式提供了一种清晰和可维护的方式来分离操作和对象本身。
  • 这种模式特别适合于库和框架,其中对象结构预定义,而操作则由最终用户通过访问者来定义。
相关推荐
小王子10243 分钟前
设计模式Python版 组合模式
python·设计模式·组合模式
linwq82 小时前
设计模式学习(二)
java·学习·设计模式
小王子10241 天前
设计模式Python版 桥接模式
python·设计模式·桥接模式
Cikiss1 天前
「全网最细 + 实战源码案例」设计模式——桥接模式
java·后端·设计模式·桥接模式
纪元A梦2 天前
Java设计模式:行为型模式→观察者模式
java·观察者模式·设计模式
荣--2 天前
DAB实现中用到的主要设计模式
设计模式·dab
mofei121382 天前
Python设计模式 - 组合模式
python·设计模式·组合模式
小王子10242 天前
设计模式Python版 抽象工厂模式
python·设计模式·抽象工厂模式
利刃大大2 天前
【C++】设计模式详解:单例模式
c++·单例模式·设计模式
小小工匠2 天前
设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用
设计模式·模板方法模式