基本上每个实体都会有一系列的喂养行为。 出于某种原因,我提出的模型感觉不对。我认为最令人不安的是使用单身人士是有道理的。
有更好的方法吗?
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;
}
}
答案 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
{
...