Bonjour,

J'essaye de refactoriser mon code pour qu'il soit un peu plus pro.
N'étant pas du métier, j'ai du mal à choisir les bons patterns pour la conception de mon appli.
Je trouve que mon appli est fortement couplé et donc difficille pour la maintenance et futures évolutions.

Par exemple :
J'ai une classe "ZOO" qui contient une liste de "Secteur".
Ma classe "Secteur" contient une liste de "Cage".
Ma classe Cage contient une liste d' "Animal"

Zoo.java
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
 
public abstract class Zoo {
 
	private List<Secteur> 					secteurs        = new ArrayList<Secteur>();
 
	/**
         * Renvoie l'ensemble des secteur
         */
	public List<Station> getListOfStation() {
		return secteurs;
	}
 
	/**
         * Ajoute un secteur à ce zoo
         */
	protected void addSecteurToZoo(Secteur secteur) {		
		int index = this.secteurs.indexOf(station);
		// Si le secteur n'existe pas encore, ajout du nouveau secteur à la liste des secteurs
		if (index == -1) {
			//On ajoute le poste à la liste de poste
			this.secteurs.add(secteur);
		} else {
			secteur = this.secteurs.get(index);
		} 
	}
}
Secteur.java
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
 
public class Secteur{
 
	private String 								secteurName;//Nom du secteur
	private List<Cage>						cages;//Liste des cages
 
	/**
         * Création d'un secteur
         */
	public Station(String name) {
		this.secteurName = name;
		this.cages = new ArrayList<Cage>();
	}
 
	/**
         * Renvoie le nom du secteur
         */
	public String getSecteurName() {
		return stationName;
	}
 
	/**
         * Modifie le nom du secteur
         */
	public void setSecteurName(String secteurName) {
		this.secteurName = secteurName;
	}
 
	/**
         * Renvoie l'ensemble des cages
         */
	public List<Cage> getCages() {
		return cages;
	}
 
	/**
         * Ajoute une cage à ce secteur
         */
	public void addCageToSecteur(Cage cage) {
		int index = this.cages.indexOf(cage);
		// Si la cage n'existe pas encore, ajout de la nouvel cage à la liste
		// des cages
		if (index == -1) {
			// On ajoute le cage à la liste de cage
			this.cages.add(cage);
		} else {
			cage = this.cages.get(index);
		}
	}
}
La classe "Cage" et "Animal" sont presque identiques à "Secteur"

Pour sérialiser / déserialiser mon zoo, j'utilise JDOM. J'ai donc crée deux classe qui étendent de Zoo. XmlReader et XmlWriter

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
 
public class XmlReader extends Zoo{
 
	private Document document;
	private Element racine;
	/**
         * Création du lecteur de fichier XML
         */
	public XmlReader(){
		// On crée une instance de SAXBuilder
		SAXBuilder sxb = new SAXBuilder();
		try {
			// On crée un nouveau document JDOM avec en argument le fichier XML
			document = sxb.build(new File("Zoo.xml"));
			// Le parsing est terminé
		} catch (Exception e) {
			e.printStackTrace();
		}
 
		// On initialise un nouvel élément racine avec l'élément racine du
		// document.
		racine = document.getRootElement();
		//On parcours les différents noeuds de l'arbre
		readSecteur();		
	}
 
	public StationExplorer getStationExplorer(){
		return this;
	}
 
	/**
         * Permet de lire les enfants "secteur" du zoo
         */
	@SuppressWarnings("unchecked")
	private void readSecteur() {
		// On crée une List contenant tous les noeuds "secteur" de l'Element racine
		List<Element> listOfSecteur = racine.getChildren("secteur");
		for(Element element : listOfSecteur){
			//On crée un secteur avec son nom comme attribue
			Secteur secteur = new Secteur(element.getAttributeValue("name"));
			//On ajoute le secteur au zoo
			addSecteurToZoo(secteur);
			//On lit les autres noeuds enfants (cage)
			readCage(secteur,element);
 
		}			
	}
 
	/**
         * Permet de lire les enfants "cage" du secteur
         */
	@SuppressWarnings("unchecked")
	private void readCage(Secteur secteur,Element elementSecteur) {
		// On crée une List contenant tous les noeuds "cage" de l'Element "secteur"
		List<Element> listOfCage = elementSecteur.getChildren("cage");
		for(Element element : listOfCage){
			//On crée un départ avec son nom comme attribue
			Cage cage = new Cage(element.getAttributeValue("name"));
			// On ajoute la cage à son secteur
			secteur.addCageToSecteur(cage);
			//On lit les autres noeuds enfants (animal)
			readAnimal(cage,element);
		}			
	}
 
	/**
         * Permet de lire les enfants "equipement" du départ
         * @param departure
         * @param elementDeparture
         */
	@SuppressWarnings("unchecked")
	private void readAnimal(Cage cage,Element elementCage) {
		// On crée une List contenant tous les noeuds "animal" de l'Element "cage"
		List<Element> listOfAnimal = elementCage.getChildren("animal");
		for(Element element : listOfAnimal){
			//On crée un animal avec son nom
			Animal animal = new Animal(element.getAttributeValue("name"));
			//On ajoute l'équipement à son départ
			cage.addAnimalToCage(animal);			
		}			
	}
}
La classe XmlWriter est presque identique à XmlReader sauf comme son nom l'indique, elle permet d'écrire dans un fichier xml

Avec ce petit exemple, pouvez-vous m'aider à mieux concevoir mon appli pour qu'elle soit plus souple, plus pro !
Mon problème si je veux ajouter par exemple, une nouvelle variable d'instance, dans une de mes classes Zoo, Secteur, Cage ou Animal, je dois modifier aussi Xml Reader et XmlWriter avec toutes les erreurs possibles.

D'avance merci pour vos conseils