设计模式-访问者模式

简介

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

角色

  • 访问者 (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 的灵活性允许我们在运行时添加或更改对象的行为。
  • 在处理复杂的对象结构,特别是当这些结构在多个不同的上下文中以不同的方式被处理时,访问者模式提供了一种清晰和可维护的方式来分离操作和对象本身。
  • 这种模式特别适合于库和框架,其中对象结构预定义,而操作则由最终用户通过访问者来定义。
相关推荐
永卿00132 分钟前
设计模式-迭代器模式
java·设计模式·迭代器模式
使二颗心免于哀伤36 分钟前
《设计模式之禅》笔记摘录 - 10.装饰模式
笔记·设计模式
Amagi.5 小时前
Java设计模式-建造者模式
java·设计模式·建造者模式
源代码•宸1 天前
深入浅出设计模式——创建型模式之工厂模式
设计模式
天天进步20151 天前
设计模式在Java中的实际应用:单例、工厂与观察者模式详解
java·观察者模式·设计模式
尘似鹤1 天前
c++注意点(12)----设计模式(生成器)
c++·设计模式
归云鹤1 天前
设计模式十:单件模式 (Singleton Pattern)
单例模式·设计模式
夜影风1 天前
23种常用设计模式介绍
设计模式
YoseZang1 天前
【设计模式】GoF设计模式之代理模式(Proxy Pattern)
设计模式·代理模式
hqxstudying1 天前
J2EE模式---业务代表模式
java·前端·python·设计模式·java-ee·mvc