当前位置: 首页 > 知识库问答 >
问题:

使用带参数的命令模式

景星光
2023-03-14

我有一个这样的可重装武器类:

public class ReloadableWeapon {

    private int numberofbullets;
    
    public ReloadableWeapon(int numberofbullets){
        this.numberofbullets = numberofbullets;
    }
    
    public void attack(){
        numberofbullets--;
    }
    
    public void reload(int reloadBullets){
        this.numberofbullets += reloadBullets;
    }
}

具有以下接口

public interface Command {
    void execute();
}

并像这样使用它:

public class ReloadWeaponCommand implements Command {

    private int reloadBullets;
    private ReloadableWeapon weapon;
    
    // Is is okay to specify the number of bullets?
    public ReloadWeaponCommand(ReloadableWeapon weapon, int bullets){
        this.weapon = weapon;
        this.reloadBullets = bullets;
    }
    
    @Override
    public void execute() {
        weapon.reload(reloadBullets);
    }
}

客户:

ReloadableWeapon chargeGun = new ReloadableWeapon(10);
Command reload = new ReloadWeaponCommand(chargeGun,10);
ReloadWeaponController controlReload = new  ReloadWeaponController(reload);
controlReload.executeCommand();

我想知道,对于命令模式,对于我看到的示例,除了命令正在操作的对象之外,没有其他参数

此示例更改执行方法以允许使用参数。

另一个示例,更接近我在这里拥有的,在构造函数中使用参数。

在命令模式中包含参数是不是不好的做法/代码气味,在这种情况下是带有项目符号数的构造函数

共有3个答案

谢夜洛
2023-03-14

假设一个案例,你有95个子弹,你用10个子弹做了9个命令,用5个子弹做了1个命令。你已经向Invoker提交了这些命令,现在调用者不必担心还剩多少子弹。他将执行命令。另一方面,如果调用者必须在运行时提供没有子弹,那么可能是提供的子弹数量不可用的情况。

我的观点是,调用者不必担心执行命令所需的任何额外信息。正如wiki中提到的“对象用于封装稍后执行操作或触发事件所需的所有信息”

毛德曜
2023-03-14

此模式的目的是允许定义动作,并在以后执行一次或多次。

您提供的代码是这种模式的一个很好的例子:您定义了“reload”动作,该动作为< code>gun装填一定数量的< code >子弹=10弹药。

现在,如果您决定修改此代码以添加子弹作为参数,那么您将完全失去此模式的目的,因为您每次都必须定义弹药量。

恕我直言,您可以保持代码原样。您必须定义多个具有不同项目符号值的 ReloadWeaponCommand 实例。然后,您可能必须使用另一种模式(例如策略)在命令之间切换。

井通
2023-03-14

我不认为在执行中添加参数将是糟糕的设计或违反命令模式

这完全取决于您希望如何使用命令对象:Singleton或Prototype范围。

如果使用Prototype范围,则可以在构造函数中传递命令参数。每个命令实例都有自己的参数。

如果使用单一实例作用域(共享/重用实例),则可以在执行方法中传递命令参数。在这种情况下,命令的单一实例应该是线程安全的。这个解决方案也是IoC / DI框架的朋友。

 类似资料:
  • 问题内容: 我需要接受命令行参数才能以以下格式运行Go程序: 我正在使用。但是它只接受到‘1-‘。’> A’被跳过。 非常感谢您对解决此问题的任何帮助。 谢谢 问题答案: 您的外壳将IO 重定向解释为IO 重定向。Shell打开该文件作为命令的标准输出,并将参数传递给命令。 引用参数以避免这种情况:

  • 问题内容: 我正在向数据库中插入大约500 000个对象,其中许多对象是相同的(数据库中具有相同的主键表示),但是其他字段可能不同,因此我使用的方法是“更新-如果没有受影响的行-插入”。问题在于,有时对象的某些字段设置为null(无法从文件读取),并且已经在数据库中设置了某些值,因此我将其更新为null =删除它。)如何实现方案,即只更新字段不为空? 这是我现在如何做的一个简单示例: 问题答案:

  • 问题内容: 我正在尝试从命令行运行Java计算器应用程序。参数如下:运算符operon1操作数2。我可以为+和-成功运行Java程序。 例如 Java Calc + 2 4 Java Calc-10 4 但是当我尝试运行 java * 2 5时 给出输出: .classpath .project .settings 我通过反复试验发现使用单引号(’‘)解决了我的问题。所以我现在有两个问题。 1.使

  • 这是我得到的问题“编写一个程序来读取和显示2个命令行参数和命令行参数数组的长度”。 这是我用Java给出的答案。。这是正确的吗?

  • 本文向大家介绍Linux rpm 命令参数使用详解,包括了Linux rpm 命令参数使用详解的使用技巧和注意事项,需要的朋友参考一下 rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,而源代码包将会由RPM自动编译、安装。源代码包经常以src.rpm作为后缀名。 常用命令组合:  -ivh:安装显示安装进度--install--verb

  • 为了方便起见,我们支持在运行 Blade 应用的时候修改一些配置,比如我在运行时指定端口: java -jar blade-app.jar --server.port=9088 当然还支持一些其他的命令行参数,看看下面的表格: 命令行参数 描述 示例 server.address 服务地址,默认是本机 0.0.0.0 回环地址 --server.address=192.168.1.100 serv