陷入复合设计模式

时间:2018-04-12 03:34:13

标签: design-patterns

练习题问题

以下是PacMan等游戏中Command设计模式的可能实现。在该特定版本的PacMan游戏中,用户可以发出命令以在四个方向(右,左,上,下)中的任何一个方向上移动PacMan。还有一个单独的命令用于攻击恰好位于同一位置的其他参与者,例如GHOSTS。 Receiver for all命令是PACMAN(未显示)。

现在要求您实现允许用户定义的新要求 宏,即可以作为一个命令执行的命令组合。以下是此类宏命令的三个示例:

  1. 名为“southwest”的宏命令将是两个命令的组合:向下,向左。
  2. 一个名为“northeast”的宏命令将是两个命令的组合:right,up。
  3. 一个名为"东北攻击的宏命令“将是三个的组合 命令:东北,攻击,西南。
  4. 描述如何修改系统设计的这一部分以适应新要求。不要关心用户界面更改,例如如何修改GUI以允许用户定义宏。您还必须说明您认为修改后的设计是最合适的解决方案的原因。

    清楚地表明如何实现诸如“northeast”之类的宏命令(伪艾菲尔德代码就足够了)。

    我的尝试:

    我使用复合设计模式,因为每个新的宏命令都是单个命令的组合,如向上,向左,向右或向下。

    所以我做的是创建了另一个类composite_command,其中添加了命令列表。

    从composite_command开始,新的宏命令类(例如northeast)将继承它,并在" northeast"的执行方法中继承。我会循环遍历子列表并调用它们的执行方法。像children [i] .execute所以当客户端创建一个宏对象时,它可以向右和向上传递,这将被添加到东北子列表中,执行将调用他们的孩子& #39; s执行。

    我的尝试是否正确?

1 个答案:

答案 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();
    }
}
  

您还必须说明您认为修改后的设计是最合适的解决方案的原因。

因为它促进了代码重用,所以你破坏某些东西的可能性就会降低。此外,客户端不需要更改,因为宏命令也是命令。