【问题标题】:Is this code some kind of command pattern?这段代码是某种命令模式吗?
【发布时间】:2019-06-13 05:25:51
【问题描述】:

我有一个方法需要执行多个任务才能完成更大的任务。每个任务大概有 20-30 行代码,所以我决定每个任务都有一个类。

public void bigTask() {
    TaskProcessor executor = new TaskProcessor();
    executor.addTask(new Task1(some arguments here));
    executor.addTask(new Task2(some other arguments here));
    executor.addTask(new Task2(some other arguments here));
    executor.run();
}

public interface Task {
    public void execute();
}

public class Task1 implements Task {
    @Override
    public void execute() {
        //Some code here
    }
}

public class Task2 implements Task {
    @Override
    public void execute() {
        //Some other code here
    }
}

public class Task3 implements Task {
    @Override
    public void execute() {
        //Some other code here
    }
}

public class TaskProcessor implements Serializable {

    private List<Task> tasksList;

    public TaskProcessor () {
        this.tasksList = new ArrayList<Task>();
    }

    public void addTask(Task task) {
        this.tasksList.add(task);
    }

    public void execute() {
        for (Task task : this.tasksList) {
            task.execute();
        }
    }
}

对我来说,这段代码就像一个命令模式,但我不确定,因为每个任务的参数类型不同,不像传统的命令模式。

您认为这可以被视为命令模式实现吗? 您认为这种方法可以拆分大方法吗?

谢谢

【问题讨论】:

  • 是的,这看起来可能适合命令模式。 Task 接口的全部意义在于您不必担心实现。您只需要知道每个Task 实现实际上都有一个execute() 方法。
  • 您可以让各个任务将自己注册到传递给他们的 TaskExecutor,例如public Task1(TasksExecutor executor){executor.addTask(this);}

标签: java design-patterns command-pattern


【解决方案1】:

您认为这可以被视为命令模式实现吗?

我认为这已经足够“命令模式”了。

您认为这种方法可以拆分大方法吗?

我们使用了一种非常相似的方法来剖析长“序列”小“动作”。但是我们添加了不同类型的“容器”。如:有时我有一系列动作应该继续执行,即使一个条目失败。在其他情况下,整个序列应立即停止。另一种风格是序列,其中每个 Action 也有一个 undo() 方法,因此当某个 Action 失败时,序列容器可以回滚所有先前(通过)的 Action。

根据您的上下文,您可能会“准备就绪”,但我认为您至少应该考虑一下您的个人任务会发生什么/是否会失败,以及您的 TaskProcessor 容器应该如何应对失败步骤。

【讨论】:

    【解决方案2】:

    结构而言,这段代码是Command设计模式的应用。四人帮中的模式参与者映射如下:

    • Task 是模式中的Command 接口,带有execute 方法;
    • Task1-3 是具体命令;
    • TaskProcessorInvoker,它“要求命令执行请求”

    然而,就意图而言,有些不匹配。四人帮一书中所说的命令模式的原意是

    将请求封装为对象,从而使您可以对具有不同请求、队列或日志请求的客户端进行参数化,并支持可撤消的操作。

    但是,问题“您认为这种方法可以拆分大方法吗?”建议目标是提供复杂计算的模块化分解,这是不一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2013-11-24
      • 2013-08-12
      • 1970-01-01
      • 2017-07-06
      相关资源
      最近更新 更多