The idea
我需要创建命令。命令可以配置参数。
并非每个命令都可以接收相同的参数。所以有些必须被忽略。
我有一个抽象类 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");
}
...
}
如果您希望参数适用于某个具体命令,例如 FTPCommand。
你必须做这样的事情:
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 。
这看起来很经典双重派遣 http://en.wikipedia.org/wiki/Double_dispatch or visitor http://en.wikipedia.org/wiki/Visitor_pattern设想。来自双重调度参考:
一种将函数调用分派给不同具体对象的机制
函数取决于涉及的两个对象的运行时类型
电话
The Parameter
和CommandBuilder
他们之间需要就该做什么进行互动。
The CommandBuilder
可以回调参数。这Parameter
对象都实现一个公共接口并且每个子类的实现会有所不同。
public CommandBuilder append(Parameter p) {
// the append method called depends on the underlying type of 'p'
p.append(this);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)