我正在开发一个用Java编写的小游戏(但这个问题与语言无关).因为我想探索各种设计模式,所以我对复合模式 /实体系统(我最初在这里和这里读到)作为典型的深层次继承的替代方案.
现在,在写了几千行代码后,我有点困惑.我认为理解模式,我喜欢使用它.我认为它非常酷,而且星巴克也是如此,但它觉得它提供的好处有点短暂而且(最让我烦恼的是)在很大程度上取决于你的粒度.
这是上面第二篇文章的图片:

我喜欢对象(游戏实体或任何你想要称之为的东西)的方式有一组最小的组件,推断的想法是你可以编写类似于下面的代码:
BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();
Alien.addComponent(new Position(), new Movement(), new Render(), new Script(), new Target());
Player.addComponent(new Position(), new Movement(), new Render(), new Script(), new Physics());
Run Code Online (Sandbox Code Playgroud)
..这将是非常好的...但在现实中,代码最终看起来像
BaseEntity Alien = new BaseEntity();
BaseEntity Player = new BaseEntity();
Alien.addComponent(new Position(), new AlienAIMovement(), new RenderAlien(), new ScriptAlien(), new Target());
Player.addComponent(new Position(), new KeyboardInputMovement(), new RenderPlayer(), new ScriptPlayer(), new PhysicsPlayer());
Run Code Online (Sandbox Code Playgroud)
似乎我最终得到了一些由较少组件组成的非常专业的组件.通常,我必须制作一些具有其他组件依赖性的组件.毕竟,如果你没有位置,你怎么渲染?不仅如此,你最终渲染玩家与外星人和手榴弹的方式可能根本不同.除非你制作一个非常大的组件(在这种情况下......为什么你还在使用复合模式?),你不能拥有一个指示所有三个组件的组件.
给出另一个真实的例子.我的游戏中有角色可以装备各种装备.当装备一件装备时,会改变一些统计数据以及视觉上显示的内容.这是我的代码现在的样子:
billy.addControllers(new Movement(), new Position(), new CharacterAnimationRender(), new …Run Code Online (Sandbox Code Playgroud)