关于“设计模式”:对象的对象和容器

时间:2014-02-06 20:41:55

标签: c# xna

我有一个包含它的对象和类。

第一个示例显示该对象具有一个名为Action的特殊函数,并且容器在必要时调用它。关键是Action是在Object类中构建的。

第二个示例显示对象更简单,它没有Action,但它在Container类中实现为函数,并应用于某个对象。

这两种方法有什么区别,与它们有关的问题是什么?

例1:

public class Object
{
  Vector2 position;
  //ecc

  //Constructor

  void Action()
  {
    //...
  }

  //ecc.
}

public class Container
{
  List<Object> mylist = new List<Object>();
  //something 

  //Constructor

  public void Update(GameTime gametime)
  {
    //something 

    Object obj = //Random object from list
    obj.Action();
  }
 }

例2:

public class Object
{
  Vector2 position;
  //ecc

  //Constructor

  //Without action

  //ecc.
}

public class Container
{
  List<Object> mylist = new List<Object>();
  //something 

  //Constructor

  public void Action(Object obj)
  {
    //Do the same thing as done above to obj
  }

  public void Update(GameTime gametime)
  {
    //something 

    Object obj = //Random object from list
    Action(obj);
  }
 }

1 个答案:

答案 0 :(得分:1)

不同之处在于您可能lowering cohesion并且违反了Information Expert GRASP原则。其中说方法应该在对象中,包含方法使用的大多数数据。在您的情况下,很明显该方法仅适用于Object的字段。这导致较低的内聚力。此外,它在集合和对象之间创建紧密耦合,例如,这使得Object的子类化变得很难,并使Action做更多的事情。

另一方面,与您正在使用的XNA标记相关,第二个选项可能是优化的开始。如果您使Object成为struct并使用ref修饰符,则可以保存一些CPU的滴答以处理此对象。如果你有大量的这些对象,这可能会派上用场。像几十万。像粒子系统一样。