2012-07-08 65 views
0

我有建设者:建造者模式。扩展接口

public abstract class ScriptBuilder { 
    public void buildScript() { 
     this.commandList = Lists.newArrayList(); 
    } 
    public abstract void buildSleepCommand(long time); 
    public abstract void buildSynchronizationCommand(); 
    public abstract void buildTouchDownCommand(TouchPoint touchPoint); 
    public abstract void buildTouchUpCommand(); 
    public List<String> getScript() { 
     return commandList; 
    } 
} 

实现:

public class StandardScriptBuilder extends ScriptBuilder{ 
… 
} 

我需要构建新的构建,它实现了新的接口。此新界面基于ScriptBuilder界面:

class NewScriptBuilder extends StandardScriptBuilder{ 
    public void buildNewCommand(TouchPoint startTouchPoint, TouchPoint endTouchPoint) { 
     buildTouchDownCommand(startTouchPoint); 
     buildSynchronizationCommand(); 
     buildTouchDownCommand(endTouchPoint); 
    } 
    … 
} 

是否有任何模式可以扩展现有的构建器接口并保持构建器的优势?我的意思是,如果我们扩展接口,我们不能做:

ScriptBuilder builder = new NewScriptBuilder(); 
… 
builder.buildNewCommand; 

如果没有解决,这是正常使用?:

((NewScriptBuilder)builder).buildNewCommand; 

THX。


我的意思是:例如,我们可以使用Decorator模式:

public abstract class Decorator extends ScriptBuilder {...} ... 

public class OahDecorator extends Decorator { 
... 
    public void buildNewCommand() { 
    ... 
    } 
} 

它的代码正常组织,或者选择不同的模式是什么? 任务 - 在构建器中添加新方法。

回答

1

如果你想让一个类实现多个行为,你应该让它实现多个接口。对类进行编码通常是不好的做法 - 您应该改用接口编码。这种差异是微妙的,但仍然非常相关和真实。

当您发现自己明确投射时,通常意味着您的界面不太适合该任务。目标是让客户端代码尽可能少地了解它正在处理的对象的实际类型。

+0

感谢您的建议。我想使用多个接口。并创建类,实现其中的一些(取决于需求)。 – Aleksandr 2012-07-09 08:18:42

0

使用接口的想法是,你不关心实现类型是什么,你不需要在子类上的具体方法。如果您确实需要调用子类特定的方法,则需要像上面所做的那样沮丧。

0

事实上,你想打电话给builder.buildNewCommand()意味着你已经知道它是NewScriptBuilder类型。为什么不只是宣布它NewScriptBuilder呢?

NewScriptBuilder builder = new NewScriptBuilder(); 
... 
builder.buildNewCommand(); 

如果这是不可能的(也许你正在使用外部API?),那么你可以包装ScriptBuilder而不是扩展它:

public class NewScriptBuilder { 
    private final ScriptBuilder builder; 

    public NewScriptBuilder(ScriptBuilder builder) { 
    this.builder = builder; 
    } 

    public void buildNewCommand(TouchPoint startTouchPoint, TouchPoint endTouchPoint) { 
    builder.buildTouchDownCommand(startTouchPoint); 
    builder.buildSynchronizationCommand(); 
    builder.buildTouchDownCommand(endTouchPoint); 
    } 
} 

,只要你想使用创建新实例buildNewCommand

ScriptBuilder builder = ...; 
NewScriptBuilder newBuilder = new NewScriptBuilder(builder); 
newBuilder.buildNewCommand();