javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > JS访问者模式

JS设计模式之访问者模式的用法详解

作者:慕仲卿

JS访问者模式是一种行为型设计模式,用于将算法与对象结构分离, 该模式允许你定义新的操作(访问者)而无需修改现有对象结构(被访问者), 通过这种方式,你可以在不改变对象结构的情况下添加新的操作,本文就给大家详细的讲讲JS访问者模式的用法

定义和特点

访问者模式是一种行为型设计模式,用于将算法与对象结构分离。 该模式允许你定义新的操作(访问者)而无需修改现有对象结构(被访问者)。 通过这种方式,你可以在不改变对象结构的情况下添加新的操作。

参与者

在访问者模式中,有两个主要角色:被访问者和访问者。

使用流程

通俗的理解

访问者设计模式有两个部分完成,在实现不同目标的过程中保持其中一方(被访问者)的结构不变,只修改另外一方的结构(访问者)。 也就是牺牲一个保全另外一个。

作用

访问者模式允许你将算法与对象结构分离,并通过定义访问者接口和被访问者接口来实现多态性。 这种模式适用于需要对一个对象结构中的元素进行不同操作的场景,同时又希望保持对象结构的稳定性。

举例

// 被访问者接口:点心店
interface Bakery {
  accept(visitor: CustomerVisitor): void;
  make(): string;
  makePlus(): string;
}
// 具体的被访问者:圆点心店
class CirclePastry implements Bakery {
  // 被访问者的接受方法
  accept(visitor: CustomerVisitor): void {
    // 将自身作为参数(this)传递给访问者的具体访问方法
    visitor?.visitCirclePastry(this);
  }
  make(): string {
    return "制作圆点心";
  }
  makePlus(): string {
    return "制作精品圆点心";
  }
}
// 具体的被访问者:方点心店
class SquarePastry implements Bakery {
  accept(visitor: CustomerVisitor): void {
    visitor?.visitSquarePastry(this);
  }
  make(): string {
    return "制作方点心";
  }
  makePlus(): string {
    return "制作精品方点心";
  }
}
// 访问者接口:顾客
interface CustomerVisitor {
  visitCirclePastry(pastry: CirclePastry): void;
  visitSquarePastry(pastry: SquarePastry): void;
}
// 具体的访问者:点心爱好者
class PastryLover implements CustomerVisitor {
  visitCirclePastry(pastry: CirclePastry): void {
    console.log(`点心爱好者选择了${pastry.make()}`);
  }
  visitSquarePastry(pastry: SquarePastry): void {
    console.log(`点心爱好者选择了${pastry.make()}`);
  }
}
// 使用示例
const circlePastry: Bakery = new CirclePastry();
const squarePastry: Bakery = new SquarePastry();
const pastryLover: CustomerVisitor = new PastryLover();
circlePastry.accept(pastryLover); // 输出:点心爱好者选择了制作圆点心
squarePastry.accept(pastryLover); // 输出:点心爱好者选择了制作方点心
// 在保证被访问者结构的不变的前提下通过修改访问者的结构达到完成不同操作的目的
// 访问者接口:高级顾客
interface CustomerVisitorPlus {
  visitCirclePastry(pastry: CirclePastry): void;
  visitSquarePastry(pastry: SquarePastry): void;
}
// 具体的访问者:高级点心爱好者
class PastryLoverWithMoney implements CustomerVisitorPlus {
  visitCirclePastry(pastry: CirclePastry): void {
    console.log(`点心爱好者选择了${pastry.makePlus()}`);
  }
  visitSquarePastry(pastry: SquarePastry): void {
    console.log(`点心爱好者选择了${pastry.makePlus()}`);
  }
}
const pastryLoverWithMoney: PastryLoverWithMoney = new PastryLoverWithMoney();
circlePastry.accept(pastryLoverWithMoney); // 输出:点心爱好者选择了制作高级圆点心
squarePastry.accept(pastryLoverWithMoney); // 输出:点心爱好者选择了制作高级方点心
// 可以看出来circlePastry和squarePastry都被复用了

Babel插件中的使用

在 Babel 插件中修改 AST(抽象语法树)时,通常会使用访问者模式。

应用场景

以上就是JS设计模式之访问者模式的用法详解的详细内容,更多关于JS访问者模式的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文