Devo utilizzare il modello di progettazione della strategia o qualcos'altro?

2

Recentemente ho iniziato a leggere Heads First Design Pattern Book oltre a programmare il mio progetto per l'ultimo anno. Nel mio progetto ho Tanks che estende Entity . Un'entità può essere qualsiasi cosa nel gioco che è posizionabile sulla mappa di gioco. L'entità è una classe astratta.

Ho un metodo move() nella mia classe Entità che verrà utilizzato per modificare la posizione del serbatoio. Avrò molti tipi diversi di tank nel mio gioco e si muoveranno più velocemente o più lentamente in base alla velocità che hanno. Ora la mia domanda è, ho letto sul modello di strategia e in base ad esso dovrei usare l'interfaccia per il movimento in quanto non voglio continuare a ignorare o cambiare il comportamento del metodo di spostamento ogni volta in diversi serbatoi. Forse se un carro armato non si muove, devo mantenere il metodo di spostamento vuoto.

Quindi, dovrei preferire il metodo di codifica move() in ogni Tank introdurre un'interfaccia Movable nella classe Tank ? Ciò sarà utile in quanto posso modificare il comportamento del movimento del serbatoio durante il tempo di esecuzione, ma poi non sono sicuro di come farlo, in quanto potrei dover introdurre la posizione xey del serbatoio all'interno delle implementazioni dell'interfaccia in qualche modo e modificarle di conseguenza. Questo annullerà lo scopo della classe Entità poiché la classe Entità viene utilizzata per conservare le posizioni x e y .

Per favore suggeriscimi il modo corretto per farlo.

Fammi sapere se la domanda non è chiara perché è un po 'difficile esprimere la mia domanda in quanto è un po' complessa.

    
posta Sneh 10.10.2015 - 21:09
fonte

1 risposta

2

Quello che consiglio è mantenere tutto il comportamento nel serbatoio, ma mantenere i parametri come la velocità in un altro oggetto. Sarebbe simile a questo, in pseudocodice:

interface TankParameters {
  int getVelocity();
  int getArmor();
  int getAttackPower();
}

class Tank : Entity {
  private TankParameters parameters;
  private Point location;

  public Tank(TankParameters p) {
    parameters = p;
  }

  public void move(Direction d) {
    // Use the direction, velocity on the parameters object,
    // something else like time and calculate the new location.
  }
}

Puoi avere una singola classe Tank ma modificare il comportamento di ogni oggetto Tank passando diversi parametri in fase di costruzione.

Questa è una forma di Iniezione di dipendenza : mentre la classe TankParameters non è tecnicamente una dipendenza perché è inventata ed esiste solo per rompere le responsabilità della classe Tank, l'idea di passare oggetti arbitrari per alterare il comportamento è una pietra miliare di DI.

Questa non è una strategia , semplicemente perché TankParameters in realtà non contiene alcun algoritmo. Esiste per esternalizzare data non comportamento .

Anche se non è strettamente parte della tua domanda, cambierei anche Entity per essere un'interfaccia e usare la composizione invece dell'ereditarietà. I link sottostanti forniscono maggiori dettagli sui vantaggi dell'utilizzo di questo approccio.

Vedi anche

risposta data 10.10.2015 - 21:25
fonte

Leggi altre domande sui tag