Dopo questa query sul pattern di memento, ho provato a mettere il mio comprensione da testare.
Memento pattern stands for three things:
- Saving state of the "memento" object for its successful retrieval
- Saving carefully each valid "state" of the memento
- Encapsulating the saved states from the change inducer so that each state remains unaltered
Ho raggiunto questi tre con il mio design?
Problema
Questo è un gioco a giocatore zero in cui il programma è inizializzato con un particolare set di pedine degli scacchi - il cavaliere e la regina. Quindi il programma deve continuare ad aggiungere set di pedoni o cavalieri e regine in modo che ogni pedone sia "sicuro" per la prossima mossa di ogni altro pedone.
La condizione è che entrambi i pedoni debbano essere piazzati, o che nessuno di loro debba essere piazzato. La scacchiera con il maggior numero di cavalieri e regine non in conflitto dovrebbe essere restituita.
Implementazione Ho 4 classi per questo:
-
protected ChessBoard
(il Memento)private int [][] ChessBoard; public void ChessBoard(); protected void SetChessBoard(); protected void GetChessBoard(int);
-
public Pawn
Questo non è correlato al ricordo. Contiene informazioni sui pedonipublic enum PawnType: int { Empty = 0, Queen = 1, Knight = 2, } //This returns a value that shown if the pawn can be placed safely public bool IsSafeToAddPawn(PawnType);
-
public CareTaker
Corrisponde a custode del ricordoQuesto è un array di interi a doppia dimensione che mantiene una traccia di tutti gli stati. La ragione per cui l'array 2D è tenere traccia di quanti stati sono memorizzati e quale stato è attualmente attivo. Un esempio:
0 -2
1 -1
2 0 - Questo è lo stato corrente. Con il secondo indice 0 /
3 1 - Questo stato è stato salvato, ma è stato annullatoprivate int [][]State; private ChessBoard [] MChessBoard; //This gets the chessboard at the position requested and assigns it to originator public ChessBoard GetChessBoard(int); //This overwrites the chessboard at given position public void SetChessBoard(ChessBoard, int); private int [][]State;
-
public PlayGame
(Questo è il mittente)private bool status; private ChessBoard oChessBoard; //This sets the state of chessboard at position specified public SetChessBoard(ChessBoard, int); //This gets the state of chessboard at position specified public ChessBoard GetChessBoard(int); //This function tries to place both the pawns and returns the status of this attempt public bool PlacePawns(Pawn);
Modifica dopo la discussione con Kevin
Il modo in cui sto cercando di applicare modelli di progettazione ai miei problemi non è corretto. In un certo modo mi aiuta a capire "come" "implementarlo". Sì. Ma poi, questo non è il suo uso ideale. Potrei anche semplificare il mio problema di "apprendimento" e utilizzare i miei libri di testo.
Fai riferimento anche a questo domanda su programmers.stackoverflow e tutte le discussioni!