练习题问题
以下是PacMan等游戏中Command设计模式的可能实现。在该特定版本的PacMan游戏中,用户可以发出命令以在四个方向(右,左,上,下)中的任何一个方向上移动PacMan。还有一个单独的命令用于攻击恰好位于同一位置的其他参与者,例如GHOSTS。 Receiver for all命令是PACMAN(未显示)。
现在要求您实现允许用户定义的新要求 宏,即可以作为一个命令执行的命令组合。以下是此类宏命令的三个示例:
描述如何修改系统设计的这一部分以适应新要求。不要关心用户界面更改,例如如何修改GUI以允许用户定义宏。您还必须说明您认为修改后的设计是最合适的解决方案的原因。
清楚地表明如何实现诸如“northeast”之类的宏命令(伪艾菲尔德代码就足够了)。
我的尝试:
我使用复合设计模式,因为每个新的宏命令都是单个命令的组合,如向上,向左,向右或向下。
所以我做的是创建了另一个类composite_command,其中添加了命令列表。
从composite_command开始,新的宏命令类(例如northeast)将继承它,并在" northeast"的执行方法中继承。我会循环遍历子列表并调用它们的执行方法。像children [i] .execute所以当客户端创建一个宏对象时,它可以向右和向上传递,这将被添加到东北子列表中,执行将调用他们的孩子& #39; s执行。
我的尝试是否正确?
答案 0 :(得分:0)
是的,这是正确的。我在C#中提供了示例实现:
class Program
{
public interface Command
{
void Execute();
}
public class LeftCommand : Command
{
public void Execute()
{
Console.WriteLine("Going left");
}
}
public class DownCommand : Command
{
public void Execute()
{
Console.WriteLine("Going down");
}
}
public class SouthWestMacroCommand : Command
{
IEnumerable<Command> _commands;
public SouthWestMacroCommand(IEnumerable<Command> commands)
{
this._commands = commands;
}
public void Execute()
{
foreach(var command in _commands)
{
command.Execute();
}
}
}
static void Main(string[] Args)
{
LeftCommand leftCommand = new LeftCommand();
DownCommand downCommand = new DownCommand();
SouthWestMacroCommand southWestCommand = new SouthWestMacroCommand(new List<Command>() { leftCommand, downCommand });
southWestCommand.Execute();
Console.ReadKey();
}
}
您还必须说明您认为修改后的设计是最合适的解决方案的原因。
因为它促进了代码重用,所以你破坏某些东西的可能性就会降低。此外,客户端不需要更改,因为宏命令也是命令。