java - 如何在此 Builder 实现中摆脱 instanceof

标签 java oop design-patterns instanceof

想法

我需要创建命令。命令可以配置参数。 并非每个命令都可以接收相同的参数。所以有些不得不忽略。

我有一个抽象类 Command,我在其中定义了一个 Builder。默认情况下,每个附加参数都会抛出“UnsupportedOperationException”

public abstract class Command {

   public static abstract class CommandBuilder {

        // TODO instanceof. How to do this better?
        public CommandBuilder append(Parameter p)
            throws UnsupportedOperationException {

            if (p instanceof URLParameter)
                return append((URLParameter) p);

            if (p instanceof ActionParameter)
                return append((ActionParameter) p);

            if (p instanceof RepeatParameter)
                return append((RepeatParameter) p);

            if (p instanceof TimeOutParameter)
                return append((TimeOutParameter) p);

            return this;

        }

        public CommandBuilder append(URLParameter p)
                throws UnsupportedOperationException {

                    throw new UnsupportedOperationException(
                        "URLParameter not applicable");

        }

        public CommandBuilder append(RepeatParameter p)
            throws UnsupportedOperationException {

                throw new UnsupportedOperationException(
                    "RepeatParameter not applicable");

            }
            ...

}

如果您希望参数适用于某个具体命令,可以说是一个 FTP 命令。

你将不得不做这样的事情:

public class FTPCommand extends Command {

    public static class Builder extends CommandBuilder {

    @Override
    public CommandBuilder append(URLParameter p) {
            System.out.println("URLParemeter appended");
                return this;
            }
        }

}

因此,当提供 URLParameter 时,它不再抛出异常,而是应用它。

但是这个 CommandBuilder 的客户端可能无法提供具体的子类。所以通常会给出一个“参数”。但是需要去对地方(方法)

就像一个 URLParameter 必须到达 append(UrlParameter p)

我怎样才能以干净(呃)和漂亮(r)的方式做到这一点?因为我对使用 instanceof 不是很“热情”。

最佳答案

这看起来很经典double-dispatchvisitor设想。来自双重调度引用:

a mechanism that dispatches a function call to different concrete functions depending on the runtime types of two objects involved in the call

ParameterCommandBuilder 需要就其操作进行交互。

CommandBuilder 可以回调参数。 Parameter 对象都实现了一个通用接口(interface),每个子类的实现 会有所不同。

public CommandBuilder append(Parameter p) {
   // the append method called depends on the underlying type of 'p'
   p.append(this);
}

关于java - 如何在此 Builder 实现中摆脱 instanceof,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792950/

相关文章:

c++ - 仅在 Manager 类中创建对象

java - 机器人,oauth 1.0a,抄写员=异常

java - 如何确定 Oracle 中给定字符串的语言(英文,中文...)?

python - 类中属性的顺序

c++ - 简单的 C++ 继承示例,有什么问题?

design-patterns - Abstract Factory & Façade,协同设计模式

java - 实例化其子类将取决于用户输入的对象

java - 如何用 Swing 制作 Canvas ?

java - 格式化一段时间

c++ - 将功能实现为仿函数的优点和缺点