2016-05-13 8 views
0

Ich habe Probleme bei der Wahl Design-Muster in der unten beschriebenen Fall: Ich habe Anfragen, die im Grunde gleich sind, aber jeder fügt einige weitere Eigenschaften, Beispiel: Animal ist BaseClass mit einigen Eigenschaften (bool Color{get; set;} ....), Katze und Hund müssen Animal ableiten, aber einige weitere Eigenschaften hinzufügen, zum Beispiel Dog => bool IsBarking {get; set; } und Cat bool isMewIng {get; set;}; Diese Anfragen werden an den Server gesendet, der sie auf Anfrage Art unterschiedlich verarbeiten wird, aber es wird einige Eigenschaften der Anfragen, die gleich verarbeitet werden. Zum Beispiel public void Validation(request) wird für alle Anfragen gleich sein ...Wählen Design-Muster beim Senden der Anfrage der gleichen Basistyp

Vielen Dank für Ihre Hilfe!

+2

Klingt nach Hausaufgaben? – JonE

+0

Spezifische Fragen zum Design sind für http://programmers.stackexchange.com besser geeignet, obwohl sie dies möglicherweise als auf Meinungen basieren sehen. –

+1

@NexTerren Wenn Sie auf andere Websites verweisen, ist es oft hilfreich, darauf hinzuweisen, dass [Cross-Posting] verpönt ist. (Http://meta.stackexchange.com/tags/cross-posting/info) – gnat

Antwort

1

Dies wäre ein guter Kandidat für das Besuchermuster.

Hier können Sie die folgende Basisklasse nehmen:

public abstract class Animal { 
    public abstract int Legs { get; } 
    public virtual void Speak() { Console.WriteLine("..."); } 
    public abstract void Accept(IAnimalVisitor visitor); 
} 

Hinweis das Verfahren übernehmen. Dies ist, wo die Magie mit unserem Besucherobjekt passieren wird.

Wir werden diese als unsere abgeleiteten Tiere implementieren, die wir verarbeiten müssen.

public class Cat : Animal { 
    public bool IsMewling { get; set; } 
    public override int Legs { get; } = 4; 
    public override void Accept(IAnimalVisitor visitor) { visitor.Visit(this); } 
    public override void Speak() { Console.WriteLine("Meow"); } 
} 

public class Dog : Animal { 
    public bool IsBarking { get; set; } 
    public override int Legs { get; } = 4; 
    public override void Accept(IAnimalVisitor visitor) { visitor.Visit(this); } 
    public override void Speak() { Console.WriteLine("Woof"); } 
} 

Okay, sehr gut. Ein paar Booleans mit unterschiedlichen Eigenschaftsnamen müssen wir vielleicht überprüfen. Lässt die IAnimalVisitor-Schnittstelle implementieren.

Und schließlich, erstellen wir eine Implementierung, die sehen, wenn das Tier zufällig spricht und sich je nach Zustand anders verhält.

public class LetsHearWhatItHasToSay : IAnimalVisitor { 
    public void Visit(Dog dog) { 
     if (dog.IsBarking) dog.Speak(); 
     else Console.WriteLine("Good boy!"); 
    } 
    public void Visit(Cat cat) { 
     if (cat.IsMewling) cat.Speak(); 
     else Console.WriteLine("Pretty kitty"); 
    } 
} 

Okay, großartig. Lassen Sie alles in einer kleinen Probe zusammenbinden.

void Main() 
{ 
    var animals = new List<Animal> 
    { 
    new Cat { IsMewling = true }, 
    new Dog { IsBarking = false }, 
    new Cat { IsMewling = false }, 
    new Dog { IsBarking = true } 
    }; 
    var visitor = new LetsHearWhatItHasToSay(); 
    foreach (var animal in animals) 
    { 
    animal.Accept(visitor); 
    } 
} 

Und wir bekommen unsere erwarteten Ergebnisse

Meow 
Good boy! 
Pretty kitty 
Woof 

Die Vorteile Besucher in diesem Fall zu verwenden sind, dass wir eine beliebige Anzahl von gekapselten Objekten erstellen können, die verschiedenen Arten von logischen Operationen über die Klasse verarbeiten kann Hierarchie in einer typsicheren Weise, ohne Änderungen an dieser Klassenhierarchie vornehmen zu müssen. Der Nachteil ist, dass wenn Sie ein zusätzliches Tier hinzufügen, das Sie besuchen möchten, müssen Sie jeden Besucher aktualisieren, der in der Hierarchie arbeitet.

Verwandte Themen