首页 > 其他分享 >Commands and Queries 设计模式详解

Commands and Queries 设计模式详解

时间:2023-10-28 18:24:42浏览次数:30  
标签:Commands 设计模式 查询 命令 Queries 执行

在Angular应用开发领域,Commands and Queries 设计模式是一个关键的概念,它有助于有效地管理应用程序的状态和与后端的交互。本文将深入探讨这一设计模式的核心要点,并通过实际示例来加以说明。

基本概念

命令 (Commands)

命令代表了一项能够改变系统状态的操作,通常通过向后端发起REST调用来实现。每个命令都可以返回一个结果,并在执行时考虑执行策略。每次命令执行都会返回一个Observable,它会在命令执行完成后发出(可选的成功结果),然后完成,或者在命令执行导致错误时抛出错误。

重要的是要注意,订阅结果Observable并不会触发命令的执行,这是可选的。

命令可以通过将CommandService.create工厂方法的调用结果存储为类的属性来定义。一个命令通常包括以下参数:

  1. 调度命令的函数(通常是调用连接器的函数)。
  2. 选项对象(通常用于指定执行策略)。

以下是一个示例:

protected updateCommand: Command<{ details: User }> = this.command.create(
  (payload) =>
    this.userIdService.takeUserId(true).pipe(
      switchMap((uid) =>
        this.userProfileConnector.update(uid, payload.details)
      ),
  {
    strategy: CommandStrategy.Queue,
  }
);

查询 (Queries)

与命令不同,查询是一种不改变系统状态的操作,它用于从系统中检索数据而不会对其进行修改。通常,查询返回一个Observable,它发出数据并完成,供订阅者使用。与命令一样,查询也可以定义执行策略。

执行策略

命令和查询的执行可以根据执行策略进行控制,以下是一些常见的执行策略:

  1. Parallel(并行):执行所有命令或查询并行进行,不考虑它们的顺序。

  2. Queue(队列):命令或查询按照它们的调用顺序排队执行,这是默认的执行策略。

  3. CancelPrevious(取消上一个):如果一个命令或查询尚未完成执行,新的执行将开始,并且会取消上一个执行。上一个执行的结果流将完成而不发出值。

  4. ErrorPrevious(上一个错误):如果一个命令或查询尚未完成执行,新的执行将开始,并且会为上一个执行引发错误。上一个执行的结果流将抛出错误。

实际示例

为了更好地理解Commands and Queries设计模式,让我们通过一个实际的示例来演示其应用。假设我们正在开发一个用户管理系统,我们需要创建一个命令来更新用户的详细信息。

首先,我们定义一个命令来执行用户详细信息的更新:

protected updateCommand: Command<{ details: User }> = this.command.create(
  (payload) =>
    this.userIdService.takeUserId(true).pipe(
      switchMap((uid) =>
        this.userProfileConnector.update(uid, payload.details)
      ),
  {
    strategy: CommandStrategy.Queue,
  }
);

在这个示例中,updateCommand是一个命令,它会接收用户的详细信息并将其发送到后端。我们选择了执行策略为队列,这意味着如果有多个更新请求,它们将按顺序执行,以确保数据的一致性。

现在,让我们考虑一个查询的示例。假设我们需要获取用户的个人资料:

protected getUserProfileQuery: Query<{ userId: string }, UserProfile> = this.query.create(
  (payload) => this.userProfileConnector.getProfile(payload.userId),
  {
    strategy: QueryStrategy.Parallel,
  }
);

这个查询 getUserProfileQuery 接受用户ID作为输入,并从后端获取用户的个人资料。在这里,我们选择了执行策略为并行,这意味着我们可以同时获取多个用户的资料,以提高性能。

总结

Commands and Queries 设计模式是Angular应用开发中的重要概念,它有助于管理系统状态和与后端的交互。命令用于执行可能改变系统状态的操作,而查询用于检索数据而不会改变状态。执行策略可用于控制命令和查询的执行方式,包括并行执行、队列执行、取消上一个执行和上一个错误处理。

通过合理使用Commands and Queries设计模式,您可以提高Angular应用程序的性能和可维护性,确保系统状态的一致性,并有效地管理与后端的通信。这一设计模式为复杂的应用程序提供了有力的工具,使开发人员能够更好地组织和管理代码。

标签:Commands,设计模式,查询,命令,Queries,执行
From: https://www.cnblogs.com/sap-jerry/p/17794425.html

相关文章

  • 设计模式05:状态模式、策略模式、访问者模式、中介者模式
    1.State状态模式 示例代码:packageState13;/***状态模式*意图:允许一个对象在其内部状态改变的时候改变它的行为。对象看起来似乎修改了它的类*适用于:*一个对象的行为决定于它的状态,并且它需要在运行时刻根据状态改变它的行为**/publicclassState......
  • 设计模式03:原型模式、适配器模式、桥接模式、组合模式
    1.Prototype原型模式 代码示例:packagePrototype05;/***原型模式:*意图:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象*适用于:*当一个系统应该独立于它的产品创建、构成和表示时*当要实例化的类是在运行时刻指定时例如通过动态装......
  • 设计模式04:装饰器模式、享元模式、命令模式、观察者模式
    1.Decorator装饰器模式 示例代码:packageDecorator09;/***装饰器模式*意图:动态的给一个对象添加一些额外的职责。*适用性:*在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责*处理那些可以撤销的职责*/publicclassDecoratorPatt......
  • 软考上午05设计模式-行为型
    责任链模式:意图:使多个对象都有机会处理请求,避免请求的发送者和接受者有耦合关系。将这些对象连成一条链适用:多个的对象可以处理一个请求,具体哪个处理在运行时确定在不明确指明接收者的情况下向多个对象中的一个提交请求可处理一个请求的对象......
  • 设计模式-策略模式
    参考:https://blog.51cto.com/u_16125162/6329805定义:策略模式(StrategyPattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。是一种对象行为型模式。打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方......
  • 【编程开发指南】「设计模式系列」一起来学编程界的“兵法”设计模式(序章)
    设计模式是什么设计模式是一种被广泛应用于软件开发中的技术,它可以帮助开发人员更好地组织和管理代码,提高代码的可读性和可维护性。本文将介绍设计模式的概念、分类和应用场景。设计模式的概念设计模式是一种被反复使用的代码设计经验,它可以解决特定问题的通用解决方案。设计模式不......
  • 设计模式—创建型模式之单例模式
    设计模式—创建型模式之单例模式介绍单例模式说明:一个单一的类,负责创建自己的对象,同时确保系统中只有单个对象被创建。单例模式特点:某个类只能有一个实例;(构造器私有)它必须自行创建这个实例;(自己编写实例化逻辑)它必须自行向整个系统提供这个实例;(对外提供实例化方法)单例模式......
  • 杜撰23种设计模式--命令模式
     Command:用来生命执行操作的接口ConcreteCommand类:将一个接收者对象绑定于一个动作,调用接收者相应操作,以实现ExcuteInvoker:执行类,要求该命令执行这个请求。Receiver:知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者。 命令类, receiverconcreteCom......
  • 杜撰23种设计模式--责任链模式
      Handler方法,两个方法一个setNextCarBuild设置责任的下一继任者。另一个处理抽象方法三个继承抽象Handler的类: 组装车头,车身,车尾 客户端进行调用: 在每一个责任中设置下一责任继承人,然后调用第一个责任人,就会进行组装 ......
  • Top 19 Docker Commands
    Top19DockerCommands有一天我发现了这个有创造力的社区(bytebytego)和这些有创造力的工程师设计的流程图,很惊喜很喜欢,就把他们留存了下来。......