2016-07-27 25 views
2

Ich versuche, das Strategie-Muster und kam mit dem folgenden Beispiel grok:Wie entfernt man die zirkuläre Abhängigkeit von dieser Verwendung des Strategie-Patterns?

  • ich neue Spiele auf Schach-basierte erstellen möchten, außer mit Stücken, die anders bewegen.
  • Ich möchte auch das Strategie-Muster verwenden, um Verhaltensweisen (wie sie sich bewegen können) in die Stücke zu injizieren.

Aber wenn wir Board, Piece und MoveBehavior Objekte

  • Board ->Piece weil ein Board enthält Piece s
  • Piece ->Board weil ein Stück in der Board passieren muss als ein Parameter zu
    • MoveBehavior, die diebenötigtzu entscheiden, welche Bewegungen akzeptabel sind.

Wie können wir diese zirkulären Abhängigkeit loszuwerden? Ist das nicht auch ein häufiges Problem in realistischeren Beispielen, weil Verhaltensweisen groß genug sind, um Entscheidungen treffen zu können? Ich denke, wenn das Verhalten super einfach ist, ist es nicht so wichtig, das Strategie-Muster nicht zu verwenden.

Antwort

1

Ich würde einfach Board ->Piece ->MoveBehaviour verwenden.

Der Grund dafür ist, dass die Platine die Teile enthält und die Teile ihr eigenes Bewegungsverhalten haben, je nachdem, um welchen Typ es sich handelt.

MoveBehaviour das Stück dh seine erlaubt Bewegungen erzählt (zB C#, weil das ist, was mit mir bekannt)

public Move[] Moves 
{ 
    get 
    { 
     return new Move[] { Move.Horizontal, Move.Vertical }; 
    } 
} 

Die Aufgabe MoveBehaviour nicht zu sehen ist, wenn die Piece, wo bewegen kann es anfordert Das ist die Tafel.

Weitere erklärt sich leicht in den unter C# Beispiel:

public class Board 
{ 
    public List<Piece> Pieces { get; set; } 

    public bool CanMoveTo(Piece piece, Point location) { /*...*/ } 
} 

public class Piece : IMoveBehaviour 
{ 
    public Move[] Moves { get; set; } 
} 

public interface IMoveBehaviour 
{ 
    Move[] moves { get; set; } 
} 

Und mit Methoden in Board und Piece wie RequestMove, Move, IsValidMove etc ...

Wesentlichen die Verantwortung etwas zu diesem etwas verlassen und bewege es nicht herum. MoveBehaviour ist das Verhalten einer Piece nicht die Validierung der Züge, die die Board s Verantwortung ist.

3

Es klingt wie Sie ein Abhängigkeitsinjektions-Framework verwenden können, um alle Objektinstanzen aufzulösen. Sie benötigen einen konfigurierbaren Container, wenn Sie verschiedene Kombinationen von Typen zum Instanziieren verwenden möchten. Sie könnten den konfigurierbaren Container eine Strategie nennen (indem er alle Teile auswählt, die ins Spiel kommen).

Ich würde das Board nicht für die Erstellung aller Teile und Verhaltensweisen verantwortlich machen, sondern stattdessen eine Composer-Klasse (die Dependency-Injection verwendet) verwenden.

So können Sie beispielsweise Verhaltensweisen für das Board verwenden oder auch verschiedene Board-Typen erstellen.

Siehe auch this question and answer für einige Hintergrundinformationen darüber, wie Abhängigkeitsinjektion hilft, lose Kopplung zu erhalten.