想法
我需要创建命令。命令可以配置参数。 并非每个命令都可以接收相同的参数。所以有些不得不忽略。
我有一个抽象类 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-dispatch或 visitor设想。来自双重调度引用:
a mechanism that dispatches a function call to different concrete functions depending on the runtime types of two objects involved in the call
Parameter
和 CommandBuilder
需要就其操作进行交互。
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/