装饰模式 - 我做错了吗?

时间:2015-01-03 15:54:48

标签: design-patterns decorator

我正在创建一个基于Java的游戏。我的游戏中有几种不同类型的对象:"玩家","敌人" (有几种不同的子类型),"场景对象"。所有这些课程都扩展了一个抽象的课程,这个课程对于所有其他课程来说都很常见。#34; actor"对象,因此有相当多的抽象和受保护的方法。

现在,我想为游戏中的某些对象添加阴影。从理论上讲,这听起来像装饰模式的完美工作吧?问题是,我不知道我做错了什么,因为应用阴影装饰器需要我从我的" root"中实现所有这些抽象方法。类。这并不容易,因为我的根类很复杂(涉及物理,按键听众等)。另外,方式"播放器"行为与场景对象的方式并不那么相似"行为方式。我无法实施" shadow"在顶级班级,因为有时我想要一个'#34;演员"在现场动态地失去它的影子。

这就是我怀疑的原因:

1)我是否应该考虑在这种情况下实施装饰器?

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

1 个答案:

答案 0 :(得分:1)

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

在类上创建 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#,但这无论如何都是设计问题。)