我想用设计模式方法创建两个算法。机器人应该清洁并返回初始位置。
打扫房间后,我也需要清洁路径。
我正在计划使用Command模式。但有一个疑问,要求说清洁和返回algorithem应该是可互换的并且需要两个algorithem ...所以我怀疑Stratagy比Command模式好吗?
根据命令模式,我可以将所有已执行的命令存储在List中并找出路径。但我仍然怀疑哪种模式最好(要求说两个以前需要)。
请查看设计,清洁并从不同的界面返回,所以我认为很难用工厂制作可互换的......
public interface ICleaningAlgorithm {
void Clean(IRobot robot);
}
public interface IReturnAlgorithm {
void Return(IRobot robot);
}
Example classes (without implementation):
public class CleaningAlgorithm : ICleaningAlgorithm {
public void Clean(IRobot robot) {
/* pseudocode from the post */
}
}
public class ReturnAlgorithm {
public void Return(IRobot robot) {
/* some shortest path algorithm */
}
}
设计附加的UML图像
答案 0 :(得分:0)
如果您需要两个在运行时可互换的算法,那么您应该查看Factory
模式和Command
模式。正如Oded所说,设计模式并不是相互排斥的。
例如
public interface Command
{
// First, you define a common interface for all commands.
public void execute();
}
public class Command1 implements Command
{
// Implement the execute method.
public void execute()
{
// Run some code in here.
}
}
public class Command2 implements Command
{
// Implement the execute method for the second command.
public void execute()
{
// Run some more code in here.
}
}
所以,现在你已经为命令定义了一个通用接口,这意味着可以这样引用它们:
Command com = new Command2();
// This is an important property!
现在,您将实施Factory
课程:
public class CommandFactory
{
public static int ALGO_1 = 1;
public static int ALGO_2 = 2;
public Command getInstance(int discriminator)
{
// Check the value, and if it matches a pre-defined value..
switch(discriminator)
{
case ALGO_1:
return new Command1();
break;
case ALGO_2:
return new Command2();
break;
}
}
}
这意味着您现在可以更灵活地生成这些类,并且您可以按如下方式使用此类:
CommandFactory factory = new CommandFactory();
Command com = factory.getInstance(CommandFactory.ALGO_1);
// You've just generated algorithm 1.
com.execute();
// And you've just ran the code in algorithm 1.
编辑回复
我的问题是,为什么要定义不同的接口?为什么不喜欢它:
public interface Algorithm {
void execute(IRobot robot);
}
public class CleaningAlgorithm : Algorithm {
public void execute(IRobot robot) {
/* pseudocode from the post */
}
}
public class ReturnAlgorithm : Algorithm {
public void execute(IRobot robot) {
/* some shortest path algorithm */
}
}