装饰者模式——我做错了吗?
Decorator pattern - am i doing it wrong?
我正在创建一个基于 Java 的游戏。我的游戏有几种不同类型的对象:"player"、"enemy"(有几种不同的子类型)、"scene objects"。所有这些 classes 都扩展了一个抽象 class,它对所有其他 "actor" 对象都是通用的,因此具有相当多的抽象和受保护方法。
现在,我想为游戏中的一些物体添加阴影。从理论上讲,这听起来像是装饰器模式的完美工作,对吗?问题是我不知道我是否做错了什么,因为应用影子装饰器需要我从我的 "root" class 中实现所有这些抽象方法。这并不容易,因为我的根 class 相当复杂(涉及物理、按键监听器等)。此外,"player" 的行为方式与 "scene object" 的行为方式不太相似。我不能只在顶部 class 中实现 "shadow" 因为有时我希望场景中的某个 "actor" 动态地失去它的阴影。
这就是为什么我几乎没有疑问:
1) 我是否应该考虑在这种情况下实现装饰器?
2) 如果是,如何轻松实现装饰复杂基础抽象的装饰器 classes?
我建议您考虑一下您的设计。 "Complex base abstract class" 听起来已经像一个密码 :-),将其重构为一个简单的基础摘要 class。我不会在这里使用装饰器:"game object HAS a shadow"(组合)。
在您的 class 上制作 IEffect 属性 并允许在需要时注入某些实例(例如 ShadowEffect 实例)没有错class。
public IEffect {}
public DropShadowEffect : IEffect{}
public IGameObject{
IEffect Effect;
}
public MyGameObject : IGameObject
{
public IEffect Effect;
public MyGameObject(IEffect effect){
Effect = effect;
}
}
public MySceneRenderer : IGameSceneRenderer {
public List<IGameObject> _objects;
public void Render(){
foreach(var obj in _objects){
var effect = obj.Effect;
// blit the obj into a screen,
// and apply the effect.
}
}
}
(刚注意到这是 JAva,不是 C#,但这本质上是设计问题)。
我正在创建一个基于 Java 的游戏。我的游戏有几种不同类型的对象:"player"、"enemy"(有几种不同的子类型)、"scene objects"。所有这些 classes 都扩展了一个抽象 class,它对所有其他 "actor" 对象都是通用的,因此具有相当多的抽象和受保护方法。
现在,我想为游戏中的一些物体添加阴影。从理论上讲,这听起来像是装饰器模式的完美工作,对吗?问题是我不知道我是否做错了什么,因为应用影子装饰器需要我从我的 "root" class 中实现所有这些抽象方法。这并不容易,因为我的根 class 相当复杂(涉及物理、按键监听器等)。此外,"player" 的行为方式与 "scene object" 的行为方式不太相似。我不能只在顶部 class 中实现 "shadow" 因为有时我希望场景中的某个 "actor" 动态地失去它的阴影。
这就是为什么我几乎没有疑问:
1) 我是否应该考虑在这种情况下实现装饰器?
2) 如果是,如何轻松实现装饰复杂基础抽象的装饰器 classes?
我建议您考虑一下您的设计。 "Complex base abstract class" 听起来已经像一个密码 :-),将其重构为一个简单的基础摘要 class。我不会在这里使用装饰器:"game object HAS a shadow"(组合)。
在您的 class 上制作 IEffect 属性 并允许在需要时注入某些实例(例如 ShadowEffect 实例)没有错class。
public IEffect {}
public DropShadowEffect : IEffect{}
public IGameObject{
IEffect Effect;
}
public MyGameObject : IGameObject
{
public IEffect Effect;
public MyGameObject(IEffect effect){
Effect = effect;
}
}
public MySceneRenderer : IGameSceneRenderer {
public List<IGameObject> _objects;
public void Render(){
foreach(var obj in _objects){
var effect = obj.Effect;
// blit the obj into a screen,
// and apply the effect.
}
}
}
(刚注意到这是 JAva,不是 C#,但这本质上是设计问题)。