1

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

有没有更好的办法?

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

1 回答 1

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
   {
      ...
于 2010-02-26T00:21:06.923 回答