Bonjour,

Je suis en train de concevoir un petit jeu Tic Tac Toe dans le but de m'exercer à utiliser les patterns, à essayer de comprendre pourquoi dans tel ou tel cas il faut les utiliser ou pas. Pour l'instant, j'en suis à me demander si le State Pattern est vraiment utile pour distinguer une case marquée par un X/O d'une case vierge. Et s'il est (utile), est-ce la bonne méthode pour l'implémenter.

Voilà les parties de codes concernées:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public interface SquareState {
	public static final SquareState BLANK_STATE = new BlankState();
	public static final SquareState MARKED_STATE = new MarkedState();
	
	public void mark(Square square, Mark mark) throws IllegalStateException;
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
public class MarkedState implements SquareState {
	
	@Override
	public void mark(Square square, Mark mark) throws IllegalStateException {
		throw new IllegalStateException();
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
public class BlankState implements SquareState {

	@Override
	public void mark(Square square, Mark mark) throws IllegalStateException {
		square.setMark(mark);
		square.setState(SquareState.MARKED_STATE);
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Square {
	private SquareState state = SquareState.BLANK_STATE;
	private Mark mark;
	
	public void mark(Mark mark) throws IllegalStateException {
		state.mark(this, mark);
	}
	
	public void setState(SquareState state) {
		this.state = state; 
	}
	
	public Mark getMark() {
		return mark;
	}
	
	public void setMark(Mark mark) {
		this.mark = mark;
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Player {
	private Mark mark;
	private Board board;
		
	public Player(Mark mark, Board board) {
		this.mark = mark;
		this.board = board;
	}
	
	public void takeTurn() {
		try {
			Point point = new Point('a', '1');
			board.markSquare(point, mark);
		} catch (IllegalStateException e) {
			System.err.println("Illegal ("+board.getSquaresLeft()+")");
		}
	}
}
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Board {
	private static final int MAX_ROWS = 3;
	private static final int MAX_COLUMNS = 3;
	private static final int MAX_SQUARES = MAX_ROWS*MAX_COLUMNS;
	private Map<Point, Square> squares = new HashMap<Point, Square>();
	private int squaresLeft = MAX_SQUARES;
	
	public Board() {
		buildSquares();
	}
	
	public void markSquare(Point point, Mark mark) throws IllegalStateException {
		Square square = getSquare(point);
		square.mark(mark);
		--squaresLeft;
	}

	public int getSquaresLeft() {
		return squaresLeft;
	}
}
Il y a une ligne qui me dérange, c'est le "--squaresLeft". J'aurai voulu la placer dans la méthode mark() de l'état mais il aurait alors fallu passer en paramètre le plateau à la méthode mark() que la case qui elle même l'aurait passée à celle de l'état, du coup je me suis dit que lancer une exception serait plus judicieux. Mais est-ce la bonne façon de faire, j'attends vos avis avec impatience.

Merci