A sample Memento pattern: Is it correct?

Posted by TheSilverBullet on Programmers See other posts from Programmers or by TheSilverBullet
Published on 2012-08-28T12:00:56Z Indexed on 2012/08/28 15:50 UTC
Read the original article Hit count: 289

Filed under:
|
|

Following this query on memento pattern, I have tried to put my understanding to test.

Memento pattern stands for three things:

  1. Saving state of the "memento" object for its successful retrieval
  2. Saving carefully each valid "state" of the memento
  3. Encapsulating the saved states from the change inducer so that each state remains unaltered

Have I achieved these three with my design?

Problem
This is a zero player game where the program is initialized with a particular set up of chess pawns - the knight and queen. Then program then needs to keep adding set of pawns or knights and queens so that each pawn is "safe" for the next one move of every other pawn.

The condition is that either both pawns should be placed, or none of them should be placed. The chessboard with the most number of non conflicting knights and queens should be returned.

Implementation I have 4 classes for this:

  1. protected ChessBoard (the Memento)

    private int [][] ChessBoard;
    
    public void ChessBoard();
    protected void SetChessBoard();
    protected void GetChessBoard(int);
    
  2. public Pawn This is not related to memento. It holds info about the pawns

    public 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);
    
  3. public CareTaker This corresponds to caretaker of memento

    This is a double dimentional integer array that keeps a track of all states. The reason for having 2D array is to keep track of how many states are stored and which state is currently active. An example:

    0 -2
    1 -1
    2 0 - This is current state. With second index 0/
    3 1 - This state has been saved, but has been undone

    private 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;
    
  4. public PlayGame (This is the originator)

    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);
    

© Programmers or respective owner

Related posts about c#

Related posts about design-patterns