Bonjour à tous.
En fait,j'essaie de mettre en pratique les pattern de création et j'ai décidé de traité un exercice dans lequel on donne les classes suivantes :
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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 package equilibrium; import java.io.IOException; import java.util.Iterator; public class Game { static void play(Player p1, Player p2) { Iterator<Monster> it1 = p1.monsters.iterator(); Iterator<Monster> it2 = p2.monsters.iterator(); while(it1.hasNext() && it2.hasNext()) { p2.health -= it1.next().damage; p1.health -= it2.next().damage; if (p1.health <= 0 && p2.health <= 0) { System.out.println("no winner"); return; } if (p1.health <= 0) { System.out.println(p2.name + " wins"); return; } if (p2.health <= 0) { System.out.println(p1.name + " wins"); return; } } System.out.println("draw"); } public static void main(String[] args) throws IOException { Player p1 = new Player("bob", "td3/bob-deck.txt"); Player p2 = new Player("alice", "td3/alice-deck.txt"); play(p1, p2); } }
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 package equilibrium; public class Monster { public final int damage; public Monster(int damage) { this.damage = requireValidBounds(damage, 1, 5); } private static int requireValidBounds(int value, int min, int max) { if (value < min || value > max) { throw new IllegalArgumentException("" + value); } return value; } }J'ai créé une interface qu'implémentent désormais Monster et Lightning(une classe qu'on a demandé de créer qui a presque les opérations que Monster) afin de répondre à la question de fermeture du code de parsing du fichier(si c'est pas ce qu'il faut pour fermer ce code merci de m'en aviser) :
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
22
23
24
25
26 package equilibrium; import static java.util.Objects.requireNonNull; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.stream.Stream; public class Player { public final String name; public final ArrayList<Monster> monsters = new ArrayList<>(); public int health; public Player(String name, String path) throws IOException { this.name = requireNonNull(name); this.health = 5; try(Stream<String> lines = Files.lines(Paths.get(path))) { lines.forEach(line -> { monsters.add(new Monster(Integer.parseInt(line.split(" ")[1]))); }); } } }
Mon souci c'est comment traiter cette question :
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 interface InterfacePlayer{ ArrayList<Monster> monsters = new ArrayList<>(); ArrayList<Lightning> lightnings = new ArrayList<>(); public static void createPlayer(String path)throws IOException{ try(Stream<String> lines = Files.lines(Paths.get(path))) { lines.forEach(line -> {switch(line.split(" ")[0]){ case "monster" : monsters.add(new Monster(Integer.parseInt(line.split(" ")[1]))); break; case "lightning" : lightnings.add(new Lightning(Integer.parseInt(line.split(" ")[1]))); break; default : throw new IllegalArgumentException("Texte no conform."); } }); } }
On souhaite refactorer le code qui fait un switch sur le type d'action pour ne pas coder en dur tous les types possibles d'action et ainsi permettre à n'importe quel code de définir ses propres actions.
Dans un premier temps, créer une interface ActionFactory qui va permettre d'abstraire le code de création des actions et déplacer l'implantation du code dans le main de la classe Game.
Bref implanter le design pattern factory object.
Merci d'avance!!!
Partager