Bonjour,

Je souhaiterai vous soumettre un problème de conception pour un projet en JAVA.

Pour faire simple nous avons la situation suivante :

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
 
import java.util.ArrayList;
 
 
public class Test{
 
	/**
         * Interface Item
         */
	static interface Item {
		public void affiche();
	}
 
 
	/**
         * Abstract Carre
         */
	static abstract class Carre implements Item{
		public Carre(){
		}
 
		public abstract void affiche();
 
		public void bingo(){
			System.out.println("Bingoooooooo Carre");
		}
	}
 
	/**
         * Abstract Rond
         */
	static abstract class Rond implements Item{
		public Rond(){
		}
 
		public abstract void affiche();
 
		public void bingo2(){
			System.out.println("Bingoooooooo Rond");
		}
	}
 
	/**
         * CarreA 
         */
	static class CarreA extends Carre{
		public CarreA(){
		}
 
		public void affiche(){
			System.out.println("Je suis un Carre;");
		}
	}
 
	/**
         * RondA 
         */
	static class RondA extends Rond{
		public RondA(){
		}
 
		public void affiche(){
			System.out.println("Je suis un Rond;");
		}
	}
 
	public static void main(String[] args){
		ArrayList<Item> itemList = new ArrayList<Item>();
		CarreA p = new CarreA();
		RondA s = new RondA();
		itemList.add(p);
		itemList.add(s);
 
		/*
		 * On veut pouvoir acceder a la methode bingo ou bingo2 a partir de l'ArrayList d'Item
		 * sans avoir a faire de tests "instanceof" suivi d'un cast :
		 * if(itemList.get(0) instanceof CarreA)
		 * 		((CarreA)itemList.get(0)).bingo();
		 * if(itemList.get(0) instanceof RondA)
		 * 		((RondA)itemList.get(0)).bingo2();
		 */
 
 
	}
}
Nous utilisons une librairie externe qui prend plusieurs paramètres. L'un d'entre eux est une ArrayList. Cette ArrayList doit pouvoir contenir aussi bien des Carre que des Rond. En parcourant l'ArrayList<Item> nous souhaitons avoir accès aux méthodes : bingo pour Carre et bingo2 pour Rond sans avoir à les déclarer dans l'interface (pour ne pas avoir des méthodes void sans code à l'intérieur).

J'avais demandé à mon professeur de conception un moyen d'accéder à ces méthodes sans avoir à faire le cast ni le test instanceof. Celui-ci m'a dit qu'en effet cela était très très moche, que j'avais donc un gros problème de conception et que je devais y réfléchir. Nous venons tout juste de commencer le cours de conception et nous n'avons pas vu tous les design pattern. Auriez-vous quelques pistes sur un pattern à utiliser ou du moins une façon propre de le faire ?

PS : J'ai aussi posté dans le forum de conception n'étant pas très sûr de l'endroit où le mettre.