【问题标题】:Is there a better way to model the feeding behavior of an organism?有没有更好的方法来模拟生物体的摄食行为?
【发布时间】:2010-02-25 23:41:03
【问题描述】:

基本上每个实体都会有一组它会遵循的进食行为。 由于某种原因,我想出的模型感觉不对。我认为最麻烦的部分是使用单例是有意义的。

有没有更好的办法?

public bool IsEntityEdible(Entity target)
{
    foreach (var feedingBehavior in FeedingBehaviors)
    {
        if (feedingBehavior.WouldEat(target))
        {
            return true;
        }
    }

    return false;
}

public abstract class FeedingBehavior
{
    public abstract bool WouldEat(Entity entity);   
}

public sealed class Myrmecophagy : FeedingBehavior
{
    public readonly static Myrmecophagy Instance = new Myrmecophagy();

    private Myrmecophagy() { }

    public override bool WouldEat(Entity entity)
    {
        return entity is Ant || entity is Termite;
    }
}

【问题讨论】:

  • 您能否进一步详细说明您认为这不正确的原因?生物的摄食行为并不完全是软件开发中通常建模的标准问题......
  • 我认为您需要使用 GoF 书中的 FeedingOrganism 模式。
  • @dtb - 我认为最麻烦的部分是使用单例是有意义的。
  • 我唯一能想到的是,Myrmecophagy 行为的额外课程可能是不必要的。除此之外,我认为您的解决方案非常好。一个有机体由摄食行为组成,其中每个摄食行为都是实现该行为的不可变对象。由于行为通常作为类实现,因此您的单例在这里看起来非常有效。
  • @dtb - 也许您应该考虑发布答案?

标签: c# object-model


【解决方案1】:

我认为您的解决方案非常好。一个有机体由摄食行为组成,其中每个摄食行为都是实现该行为的不可变对象。由于行为通常以类的形式实现,因此您的单例在这里看起来非常有效。

我唯一能想到的是,Myrmecophagy 行为的公开可见类可能是不必要的。您可以简单地将类放在 FeedingBehavior 中,将其设为私有,并且只公开一个持有单例的公共静态只读字段。

如果您有兴趣,我在我的一个项目中实现了 RFC3454。 RFC 描述了根据不同配置文件准备字符串的框架。因此,我创建了一个抽象类 StringPreparer,它将几个标准配置文件公开为单例实例,或者可以由用户扩展以实现自定义配置文件:

public abstract class StringPreparer
{
   public static readonly StringPreparer Domain = new DomainStringPreparer();
   public static readonly StringPreparer Node = new NodeStringPreparer();
   public static readonly StringPreparer Resource = new ResourceStringPreparer();
   public static readonly StringPreparer Sasl = new SaslStringPreparer();
   public static readonly StringPreparer Trace = new TraceStringPreparer();

   protected StringPreparer()
   {
   }

   public abstract bool TryPrepare(
      string text, int offset, int count, out string result);

   ...

   private class DomainStringPreparer : StringPreparer
   {
      public override bool TryPrepare(
         string text, int offset, int count, out string result)
      {
         ...
      }
   }

   private class NodeStringPreparer : StringPreparer
   {
      ...

【讨论】:

  • 谢谢,只是确认我的想法的基础是合理的,这非常有帮助。您的建议是锦上添花。
  • 我刚刚注意到这种模式也可以在 .NET 框架中找到。查看 System.Text.Encoding 类,它公开了几种标准编码(UTF8、UTF32 等)作为单例实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2011-12-20
相关资源
最近更新 更多