是否有更好的方法来模拟生物的摄食行为?

时间:2010-02-25 23:41:03

标签: c# object-model

基本上每个实体都会有一系列的喂养行为。 出于某种原因,我提出的模型感觉不对。我认为最令人不安的是使用单身人士是有道理的。

有更好的方法吗?

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;
    }
}

1 个答案:

答案 0 :(得分: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
   {
      ...