装饰器模式 - 我做错了吗



我正在创建一个基于Java的游戏。我的游戏有几种不同类型的对象:"玩家"、"敌人"(有几种不同的子类型)、"场景对象"。所有这些类都扩展了一个抽象类,该抽象类对于所有其他"actor"对象通用,因此具有相当数量的抽象和受保护的方法。

现在,我想为游戏中的某些对象添加阴影。从理论上讲,这听起来像是装饰器图案的完美工作,对吧?问题是我不知道我是否做错了什么,因为应用阴影装饰器需要我从我的"根"类实现所有这些抽象方法。这并不容易,因为我的根类相当复杂(涉及物理、按键侦听器等)。此外,"玩家"的行为方式与"场景对象"的行为方式不太相似。我不能只在顶级课程中实现"影子",因为有时我希望场景中的某个"演员"动态地失去它的影子。

这就是为什么我几乎没有怀疑:

1)我甚至应该考虑在这种情况下实现装饰器吗?

2)如果是,如何轻松实现装饰复杂基础抽象类的装饰器?

我建议你考虑一下你的设计。"复杂的基抽象类"听起来已经像一个代码:-),将其重构为一个简单的基抽象类。我不会在这里使用装饰器:"游戏对象有一个阴影"(构图)。

在你的类上创建IEffect属性,并在需要时允许注入某些东西的实例,例如ShadowEffect类的实例,这并没有错。

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#,但这本质上是设计问题)。

最新更新