【问题标题】:What design pattern is best employed to control a sequence of steps?哪种设计模式最适合控制一系列步骤?
【发布时间】:2016-08-24 11:16:38
【问题描述】:

我有一个使用串行端口与硬件接口的 winform 工具。

串口用于向硬件发送命令,硬件会确认命令并有时返回数据。

要完成一项任务,需要按照定义的顺序向硬件发送多个命令。

我已经使用 switch 语句成功实现了该工具来控制命令的发送。然而,虽然这可行,但我不禁想到有更好、更面向对象的方式来做这件事 - 有吗?

目前的实现如下:

每个案例都是需要发送到硬件的命令。 发送方法传递一个调用的方法和下一步的ID - 如果命令发送成功,将返回。

  • 工具将向硬件发送启动会话命令。
  • 硬件确认命令。
  • 工具向硬件发送设置方向命令。
  • 硬件将确认命令。

等等

MessageID nextStep = MessageID.IMS;

while (nextStep != MessageID.Stop)
{
    switch (nextStep)
    {
        case MessageID.ISS:
            nextStep = Send( new ISS_StartSession(), MessageID.IE386);
            RaiseProgressEvent(10); //percentage complete
            break;

        case MessageID.IE386:
            nextStep = Send( new IE386_SetDirection(Direction.BOTH), MessageID.IE378);
            RaiseProgressEvent(20);
            break;

       //etc

       case MessageID.Error:
            HandleError(); //abort task if necessary
            break;
    }
 }

有没有更好的方法来做到这一点..?

我应该看看一个众所周知的设计模式吗?

【问题讨论】:

  • 下一个 MessageID 是否正在发送到当前的 Send 呼叫?

标签: oop design-patterns serial-port


【解决方案1】:

看起来像一个状态机。网上有很多关于他们的资源。看看吧。

http://en.wikipedia.org/wiki/Abstract_state_machines

【讨论】:

    【解决方案2】:

    我猜 State 是您要寻找的 DP。

    【讨论】:

      【解决方案3】:

      特别是如果您的发送/接收操作是异步的,我建议使用命令模式。 Here 我解释了为什么我发现它适合异步操作序列。

      【讨论】:

      • Frank,碰巧传递给上面 Send 方法的方法实现了(我相信)命令模式。这些方法中的每一个都实现了一个 ICommand 接口,并详细说明了如何通过串行端口执行命令。何时执行 ICommand 取决于调用类。这就是我想要改进的地方..
      • @Frank 如何在进一步的步骤中使用 Step1 的响应? Step2完成后如何执行下一步?
      【解决方案4】:

      我建议使用责任链模式,因为步骤可以链接起来,您可以在客户端级别控制链中的链接。

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        相关资源
        最近更新 更多