当前位置: 首页 > 知识库问答 >
问题:

陷入复合设计模式

柳涵映
2023-03-14

练习题问题:

下面是命令设计模式在游戏中的一个可能的实现,例如Pacman。在这个特定版本的PacMan游戏中,用户可以发出命令,在四个方向(右、左、上、下)中的任何一个方向移动PacMan。还有一个单独的命令用于攻击碰巧在同一位置的其他演员,比如幽灵。所有命令的接收器是PACMAN(未示出)。

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

  1. 名为“Southwest”的宏命令将是两个命令的组合:down、left。
  2. 名为“东北”的宏命令将是两个命令的组合:right和up。
  3. 名为“东北攻击”的宏命令将包含三个命令:东北、攻击、西南。

描述如何修改系统设计的这一部分以适应新的需求。不要关心用户界面的更改,例如如何修改GUI以允许用户定义宏。您还必须描述为什么您认为修改后的设计是最合适的解决方案。

明确指出“东北”这样的宏命令将如何实现(伪Eiffel代码就足够了)。

我的尝试:

从composite_command中,新的宏命令类(如northeast)将从它继承,并且在“northeast”的execute方法中,我将循环子级列表并调用它们的execute方法。像children[I].execute这样,当客户端创建宏对象时,它可以向右向上传递将添加到northeast子级列表中,并且execute将调用它们子级的execute。

我的尝试正确吗?

共有1个答案

解河
2023-03-14

是的,这是正确的。我提供了用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();
    }
}

您还必须描述为什么您认为修改后的设计是最合适的解决方案。

因为它促进了代码的重用,并且很少会损坏某些东西。而且客户端也不需要更改,因为宏命令也是命令。

 类似资料:
  • 组合(Composite) Intent 将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。 Class Diagram 组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。 组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶

  • 介绍 组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 常见的场景有asp.net里的控件机制(即control里可以包含子control,可以递归操作、添加、删除子control),类似的还有DOM的机制,一个DOM节点可以包含子节点,不管是父节点还是子节点都有添加、删除、遍历子节点的通用功能。所以说组合模式

  • 本文向大家介绍java设计模式之组合模式(Composite),包括了java设计模式之组合模式(Composite)的使用技巧和注意事项,需要的朋友参考一下 概述 是一种结构型模式,将对象以树形结构组织起来,以表示“部分 - 整体”的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性。 UML类图 上面的类图包含的角色: Component:为参加组合的对象声明一个公共的接口,不管是组合还

  • 本文向大家介绍JavaScript组合设计模式--改进引入案例分析,包括了JavaScript组合设计模式--改进引入案例分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了JavaScript组合设计模式--改进引入案例。分享给大家供大家参考,具体如下: 对于组合设计模式:  (1)组合模式中把对象分为两种(组合对象,和叶子对象)  (2)组合对象和叶子对象实现:同一批操作  (3)对组

  • 本文向大家介绍23种设计模式(10)java组合模式,包括了23种设计模式(10)java组合模式的使用技巧和注意事项,需要的朋友参考一下 23种设计模式第四篇:java组合模式 介绍 组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕. 组合模式可以优化处理递归或分级数据结

  • 本文向大家介绍深入理解JavaScript系列(40):设计模式之组合模式详解,包括了深入理解JavaScript系列(40):设计模式之组合模式详解的使用技巧和注意事项,需要的朋友参考一下 介绍 组合模式(Composite)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 常见的场景有asp.net里的控件机制(即control里可以包