Modifier

Créez une énumération Action qui propose les actions SCISSOR, ROCK et PAPER

Créez une interface Player qui propose les méthodes suivantes :

void play() ; -> détermine l'action du joueur    
void setMatchResult(Player opponent, Action action, Result result) ; indique au joueur qui est son adversaire et la dernière action qu'il a joué
Action getLastAction(); -> retourne la dernière action du joueur

Créez une interface Result qui propose les méthodes suivantes :

boolean isDraw(); -> indique si le résultat du match est un match nul
Player getWinner(); -> retourne le joueur qui a gagné
Player getLoser(); -> retourne le joueur qui a perdu
List<Player> getPlayers(); -> retourne la liste des joueurs

Créez une interface Referee qui propose les méthodes suivantes :

void referee(Player p1, Player p2); 
Result getLastResult(); -> retourne le dernier résultat calculé par l'arbitre

Créez une interface PlayerFactory qui propose la méthode suivante

Player create() -> crée un Player

Créez une interface RefereeFactory qui propose la méthode suivante

Referee create() -> Créez un Referee

Créez une interface Rank qui propose les méthodes suivantes :

Player getPlayer() -> Retourne le joueur associé au classement.
int getScore() -> Retourne le score du joueur

Créez une interfance Ranking qui propose la méthode suivante :

List<Rank> getRanks(); -> Retourne une liste contenant le classement de chaque joueur

Créez une interface Tournament qui propose les méthodes suivantes :

void start() throws NoRefereeException, NoEnoughPlayerException; -> Démarre le tournoi. Cette méthode doit lancer une exception s'il n'y a pas d'arbitre ou s'il n'y a pas assez de joueurs.
Ranking getRanking() -> Retourne le classement du tournoi

Créez une interface TournamentFactory qui propose la méthode suivante :

Tournament create(); -> Crée un nouveau tournoi