2010-02-25 1 views
1

Fondamentalement, chaque entité aurait une collection de comportements alimentaires qu'il suivrait. Pour une raison quelconque, le modèle que j'ai imaginé ne me semble pas juste. Je pense que la partie la plus troublante est que l'utilisation de singletons a du sens.Existe-t-il un meilleur moyen de modéliser le comportement alimentaire d'un organisme?

Y a-t-il un meilleur moyen?

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

Pouvez-vous préciser davantage pourquoi vous pensez que cela ne se sent pas bien? Le comportement d'alimentation des organismes n'est pas exactement un problème standard qui est couramment modélisé dans le développement de logiciels ... – dtb

+0

Je pense que vous devez utiliser le modèle FeedingOrganism du livre GoF. – LeopardSkinPillBoxHat

+0

@dtb - Je pense que la partie la plus troublante est que l'utilisation de singletons est logique. – ChaosPandion

Répondre

1

Je pense que votre solution est parfaitement bien. Un organisme est composé de comportements alimentaires où chaque comportement alimentaire est un objet immuable qui met en œuvre le comportement. Comme le comportement est généralement implémenté en tant que classes, vos singletons ressemblent à une utilisation parfaitement valide ici. La seule chose à laquelle je peux penser est que la classe visible publiquement pour le comportement Myrmecophagy pourrait être inutile. Vous pouvez simplement placer la classe dans FeedingBehavior, la rendre privée et exposer uniquement un champ public statique en lecture seule contenant le singleton.

Dans le cas où vous êtes intéressé, j'ai une implémentation de RFC3454 dans un de mes projets. La RFC décrit un cadre pour la préparation de chaînes selon différents profils. J'ai donc créé une StringPreparer classe abstraite qui expose plusieurs profils standard comme des instances singleton ou qui peuvent encore être étendues par les utilisateurs à mettre en œuvre des profils personnalisés:

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 
    { 
     ... 
+0

Merci, juste obtenir la confirmation que la base de mon idée est le son est extrêmement utile. Votre suggestion est cerise sur le gâteau. – ChaosPandion

+0

Je viens de remarquer que ce modèle peut également être trouvé dans le framework .NET. Jetez un oeil à la classe System.Text.Encoding qui expose plusieurs encodages standard (UTF8, UTF32, etc.) en tant qu'instances singleton. – dtb

Questions connexes