begin process at 2010 02 09 20:24:48
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Tutoriaux

 > IMPLEMENTATION DU PATTERN DÉCORATEUR EN TROIS TEMPS EN PARTANT D'UN CODE IMPARFAIT.

IMPLEMENTATION DU PATTERN DÉCORATEUR EN TROIS TEMPS EN PARTANT D'UN CODE IMPARFAIT.


 Information sur la source

Note :
Aucune note
Catégorie :Tutoriaux Classé sous :decorateur, wrapper, abstraite, restructurer Niveau :Initié Date de création :24/07/2007 Vu / téléchargé :4 557 / 2 324

Auteur : pouicky

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 Description

Ben d'abord on a trois classes d'animaux avec leurs signature propres pour se nourrir et se deplacer
Le pretexte est un scenario ou chaque animal a une heure pour manger et une pour se déplacer.
Il s'agit d'une boucle sur les heures et quand son heure de manger ou de se deplacer arrive, l'animal s'execute.
(tout par des sorties standard, le but est de voir l'évolution du code.

Premier temps:
les oiseaux volent et mangent des graines
Les chats marchent et mangent de la viande
Les poissons nagent et mangent des algues

Deuxieme temps:
On abstrait une classe AbstractAnimal avec methodes Manger et seDeplacer génerique (abstraites)
Les trois especes d'animaux héritent de la classe abstraite et les methodes abstraites sont implementees pour permettre le meme appel de méthode pour se deplacer et se nourrir.
à chaque iteration de la boucle des heures, on test pour chaque animal si c'est son heure de manger ou de se deplacer.

Troisieme temps
On ne veut plus tester si c'est l'heure pour l'animal de se deplacer ou de manger, alors on le décore avec les methodes de controle de l'heure, pour qu'il se gere tout seul --> Classe Decorateur animalier

Le décorateur doit pouvoir se substituer à tout, il implemente donc toutes les méthodes et possede les proprietes plus celles qu'on veut apporte en amélioration.





Source

  • //premiere version du scenario (extrait)
  • public void deroulerJournee(){
  • //le chat mange à 6h00 et marche à 10h00
  • //le poisson nage à 12h00 et mange 13h00
  • //l'oiseau vole à 5h00 et mange à 19h00
  • chat=new Chat("Minou");
  • chat.setHeureDeplacement(10);
  • chat.setHeureRepas(6);
  • oiseau=new Oiseau("Birdy");
  • oiseau.setHeureDeplacement(5);
  • oiseau.setHeureRepas(19);
  • poisson=new Poisson("Flipper");
  • poisson.setHeureDeplacement(12);
  • poisson.setHeureRepas(13);
  • do {
  • System.out.println("Il est "+heure+"h00");
  • //on teste l'heure à la place des animaux, ce qui reste encore redondant
  • //La decoration permettra de palier ce point.
  • if (chat.getHeureDeplacement()==heure)chat.marcher();
  • if (chat.getHeureRepas()==heure)chat.mangerViande();
  • if (oiseau.getHeureDeplacement()==heure)oiseau.voler();
  • if (oiseau.getHeureRepas()==heure)oiseau.mangerGraines();
  • if (poisson.getHeureDeplacement()==heure)poisson.nager();
  • if (poisson.getHeureRepas()==heure)poisson.mangerAlgues();
  • System.out.println("");
  • heure=(heure+1)%24;
  • }while (heure > this.heureAube);
  • }
  • //deuxieme version
  • public void deroulerJournee(){
  • //le chat marche à 10h00 et mange à 6h00
  • chat=new Chat("Minou",10,6);
  • //l'oiseau vole à 5h00 et mange à 19h00
  • oiseau=new Oiseau("Birdy",5,19);
  • //le poisson nage à 12h00 et mange 13h00
  • poisson=new Poisson("Flipper",12,13);
  • AbstractAnimal[] bestiaire={chat,oiseau,poisson}
  • do {
  • System.out.println("Il est "+heure+"h00");
  • // code avec abstraction avant d'apporter l'autonomie aux animaux
  • for(AbstractAnimal bebete:bestiaire){//pour chaque bebete du bestiaire
  • //on appelle la mehode de la classe abstraite et c'est la methode adaptée qui se declenchera
  • if (bebete.getHeureDeplacement()==heure)bebete.seDeplacer();
  • if (bebete.getHeureRepas()==heure)bebete.manger();
  • }
  • System.out.println("---------------------");
  • heure=(heure+1)%24;
  • }while (heure != this.heureAube);
  • }
  • //troiseme version
  • public void deroulerJournee(){
  • //le chat marche à 10h00 et mange à 6h00
  • chat=new Chat("Minou",10,6);
  • //l'oiseau vole à 5h00 et mange à 19h00
  • oiseau=new Oiseau("Birdy",5,19);
  • //le poisson nage à 12h00 et mange 13h00
  • poisson=new Poisson("Flipper",12,13);
  • //DecorateurAnimalier[] bestiaire={chatDecore,oiseauDecore,poissonDecore};
  • AbstractAnimal[] bestiaire={chat,oiseau,poisson};
  • do {
  • System.out.println("Il est "+heure+"h00");
  • //Le code avec abstraction puis décoration
  • //========================================
  • for(AbstractAnimal bebete:bestiaire){//pour chaque bebete du bestiaire
  • //on compte sur l'auto gestion de l'emloi du temps par les animaux
  • //apportée par le decorateur pour ne plus tester l'heure.
  • DecorateurAnimalier bebeteDecoree=new DecorateurAnimalier(bebete);
  • bebeteDecoree.seDeplacer(heure);//le decorateur ajoute " qui a bougé" à petitNom
  • bebeteDecoree.manger(heure);//le décorateur ajoute " qui a mangé" à petitNom
  • }
  • heure=(heure+1)%24;
  • }while (heure != this.heureAube);
//premiere version du scenario (extrait)
public void deroulerJournee(){
	    //le chat mange à 6h00 et marche à 10h00
	    //le poisson nage à 12h00 et mange 13h00
	    //l'oiseau vole à 5h00 et mange à 19h00
	chat=new Chat("Minou");
	chat.setHeureDeplacement(10);
	chat.setHeureRepas(6);
	
	oiseau=new Oiseau("Birdy");
	oiseau.setHeureDeplacement(5);
	oiseau.setHeureRepas(19);
	
	poisson=new Poisson("Flipper");
	poisson.setHeureDeplacement(12);
	poisson.setHeureRepas(13);
	do  {
	    System.out.println("Il est "+heure+"h00");
		//on teste l'heure à la place des animaux, ce qui reste encore redondant
		//La decoration permettra de palier ce point.
	    if (chat.getHeureDeplacement()==heure)chat.marcher();
	    if (chat.getHeureRepas()==heure)chat.mangerViande();
	    if (oiseau.getHeureDeplacement()==heure)oiseau.voler();
	    if (oiseau.getHeureRepas()==heure)oiseau.mangerGraines();
	    if (poisson.getHeureDeplacement()==heure)poisson.nager();
	    if (poisson.getHeureRepas()==heure)poisson.mangerAlgues();
	    System.out.println("");
	    
	heure=(heure+1)%24;    
	}while (heure > this.heureAube);
    }

//deuxieme version
public void deroulerJournee(){
	
	//le chat marche à 10h00 et mange à 6h00
	chat=new Chat("Minou",10,6);

	 //l'oiseau vole à 5h00 et mange à 19h00
	oiseau=new Oiseau("Birdy",5,19);

	//le poisson nage à 12h00 et mange 13h00
	poisson=new Poisson("Flipper",12,13);

	AbstractAnimal[] bestiaire={chat,oiseau,poisson}
	do  {
	    System.out.println("Il est "+heure+"h00");
	    
		// code avec abstraction avant d'apporter l'autonomie aux animaux
		for(AbstractAnimal bebete:bestiaire){//pour chaque bebete du bestiaire
			//on appelle la mehode de la classe abstraite et c'est la methode adaptée qui se declenchera
		    if (bebete.getHeureDeplacement()==heure)bebete.seDeplacer();
		    if (bebete.getHeureRepas()==heure)bebete.manger();
	    }	    
	    System.out.println("---------------------");

	    heure=(heure+1)%24;    
	}while (heure != this.heureAube);
    }

//troiseme version
    public void deroulerJournee(){
	//le chat marche à 10h00 et mange à 6h00
	chat=new Chat("Minou",10,6);
	//l'oiseau vole à 5h00 et mange à 19h00
	oiseau=new Oiseau("Birdy",5,19);
	//le poisson nage à 12h00 et mange 13h00
	poisson=new Poisson("Flipper",12,13);

	//DecorateurAnimalier[] bestiaire={chatDecore,oiseauDecore,poissonDecore};
	AbstractAnimal[] bestiaire={chat,oiseau,poisson};
	do  {
	    System.out.println("Il est "+heure+"h00");
	    //Le code avec abstraction puis décoration
	    //========================================
	    for(AbstractAnimal bebete:bestiaire){//pour chaque bebete du bestiaire
		
		//on compte sur l'auto gestion de l'emloi du temps par les animaux 
		//apportée par le decorateur pour ne plus tester l'heure.
		DecorateurAnimalier bebeteDecoree=new DecorateurAnimalier(bebete);
		bebeteDecoree.seDeplacer(heure);//le decorateur ajoute " qui a bougé" à petitNom
		bebeteDecoree.manger(heure);//le décorateur ajoute " qui a mangé" à petitNom
	    }

	    heure=(heure+1)%24;    
	}while (heure != this.heureAube);

 Conclusion

Le pattern décorateur ou "wrapper" permet de manipuler des objets, via des méthodes plus evoluees tout en pouvant se substituer à eux.


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture LANCE REQUETES COMPLET
Source avec Zip Source avec une capture OBSERVABLE DANS L'EDT (EVITE LE RECOURS À SWINGUTILITIES.INV...

 Sources de la même categorie

NOMBRE D'OCCURENCE D'UNE CHAINE DE CARACTÈRE DANS TOUS LES F... par deadhand
Source avec Zip CLIENT / SERVER CORBA AVEC NAMESERVICE ET AVEC FICHIER par ghitaik
Source avec Zip COMMENT COPIER TOUTE UNE ARBORESCENCE par larsson
Source avec Zip JIRC IRC ROBOT CLIENT EXEMPLE par Hassen Ben Tanfous
Source avec Zip Source avec une capture MODIFICATION DU VOLUME(GAIN) ET BALANCE(PAN) SUR UN FICHIER ... par Twinuts

Commentaires et avis

Commentaire de PERRYALAIN le 24/04/2008 15:19:46

Bonne démarche pour découvrir le DP Décorateur et son usage.
Il est vrai que pas mal d'ouvrages existent, mais généralement peu pédagogiques.
L'exemple développé par Pouicky est progressif et permet de cerner l'intérêt du DP.
Question (à 1 paquet de sucres) : à quand l'extension de ces exemples aus autres DP du GoF ?

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Une classe dérivant d'une classe abstraite [ par damien781 ] hello, j'ai une erreur de type : org.w3c.dom.XXXet je dois créer une nouvelle classe dérivant d'une classe abstraite de XXX et je dois a mon avis imp Classe Abstraite & Interface [ par stela86 ] Bonjour tout le monde ! Je commence a peine le java et j'aurai voulu savoir la difference entre une classe abstraite et une interface Java !Merci d'av abstract methods [ par Ombitious_Developper ] Salut: J'ai une chose que je comprends pas: Normalement une méthode abstraite n'a pas de corps (d Api java service wrapper: exemples [ par kam81 ] Salut,Quelqun pourrait me montrer comment utiliser l'api java service wrapper pour creer des applications java en tant que services windows.merci. HELP :Difference Interface et classe abstraite [ par karamilano ] slt tt le monde j ai deux  ptits problemes :1==>   j arrive pas a distinguer entre une interface et une classes abstraite il me semble qu ils ont t classe abstraite [ par mimosa803 ] Salut, j'ai une question conecernant les classes abstraites : Quand est ce qu'on peut instancier un objet à partir d'une interface ou une classe abstr Java + C/C++ /JNI wrapper... [ par fraisa1985 ] Je suis entrain de developpé une application composé de 3 parties:2 sont developpé en java et une en C/C++.Ma probleme est comment basculer du partie Appel classe abstraite [ par betty555 ] Bonjour,J'ai un petit problème avec une classe abstraite, il y a l'appel du contructeur mais comme on a pas de constructeur dans une classe abstraite [Hibernate] [ par lookthat ] Bonjour à tous, J'ai un petit soucis avec Hibernate que je n'arrive pas à résoudre. Explication : J'ai deux classe abstraite A1 et A2 qui hérite tout [Reflection] Recuperer la classe fille directe effective d'une classe mere abstraite [ par loloof64 ] Salut à tous [^^happy13] Je me doute que ma question puisse être difficile à résoudre, mais je la pose quand même, on ne sait jamais. (Les recherches


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales