【问题标题】:Decorator pattern - am i doing it wrong?装饰器模式 - 我做错了吗?
【发布时间】:2015-01-03 15:54:47
【问题描述】:

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

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

这就是为什么我很少怀疑:

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

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

【问题讨论】:

  • 我建议您考虑一下您的设计。 “复杂的基础抽象类”听起来已经像代码味道了:-),将它重构为一个简单的基础抽象类。我不会在这里使用装饰器:“游戏对象有阴影”(构图)。在你的类上创建IEffect proerty 并在需要时允许注入某些东西的实例并没有错,例如ShadowEffect 类的实例。
  • 啊!似乎是个好主意!所以,你是在告诉我实现“IEffect”,它会在“ShadowEffect”对象被传递的情况下投射阴影(由“ShadowEffect”定义),对吧?
  • 太好了,你能把答案贴出来让我接受吗?
  • 为什么你认为装饰器是适合你的模式? Decorator 允许您在设计中“增强”现有方法。

标签: design-patterns decorator


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

【讨论】:

    猜你喜欢
    • 2019-02-23
    • 1970-01-01
    • 2011-08-10
    • 2014-10-17
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多