gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:09 24 4
gpt4 key购买 nike

想法

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

我有一个抽象类 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com