tgo*_*ens 5 java oop design-patterns instanceof
我需要创建命令.可以使用参数配置命令.并非每个命令都可以接收相同的参数.所以有些人必须被忽略.
我有一个抽象类Command,我在其中定义了一个Builder.默认情况下,每个append参数都会抛出'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");
}
...
}
Run Code Online (Sandbox Code Playgroud)
如果您希望参数适用于某个具体的Command,请说一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,当提供URLParameter时,它不再抛出异常,而是应用它.
但是这个CommandBuilder的客户端可能无法提供具体的子类.所以通常给出"参数".但它需要去正确的地方(方法)
就像一个URLParameter必须到达 append(UrlParameter p)
我怎样才能以干净(呃)和漂亮(r)的方式做到这一点?因为我并不是真正"使用instanceof"的'enthousiastic'.
一种机制,根据调用中涉及的两个对象的运行时类型,将函数调用分派给不同的具体函数
在Parameter
和CommandBuilder
需要彼此之间就做什么互动.
该CommandBuilder
可回拨该参数.这些Parameter
对象都实现了一个公共接口,每个子类的实现都会有所不同.
public CommandBuilder append(Parameter p) {
// the append method called depends on the underlying type of 'p'
p.append(this);
}
Run Code Online (Sandbox Code Playgroud)