Ceci est probablement un mauvais exemple, mais s'il vous plaît, travaillez avec. J'ai une super classe Cake
et deux sous-classes: ExampleCake
et SaleCake
. J'ai aussi un Baker
qui peut faire de l'ingénierie inverse d'un gâteau pour en faire une copie, et sait quoi en faire par la suite.Comment faire une classe d'utilité gérer les différences dans les sous-classes?
(Tout le code pseudo)
public class Cake{
radius;
height;
ingredients;
color;
name;
}
public class ExampleCake extends Cake{
shelfLocation;
}
public class SaleCake extends Cake{
owner;
}
public class Baker{
Cake bakeCake(Cake);
Cake bakeSaleCake(Cake, Owner);
Cake bakeExampleCake(Cake, Location);
void handleCake(Cake);
}
Le Baker a besoin de savoir comment gérer gâteaux génériques, ExampleCakes et SaleCakes. Donc, ses fonctions bakeCake ressembler à quelque chose comme ceci:
Cake bakeCake(cake){
newCake = cake.copy();
mixIngredients(newCake);
putCakeInOven(newCake);
putIcing(newCake);
return cake;
}
Cake bakeSaleCake(cake, owner){
newCake = bakeCake(cake);
newCake.setOwner(owner);
return newCake;
}
Cake bakeExampleCake(cake, location){
newCake = bakeCake(cake);
newCake.setLocation(location);
return newCake;
}
void handleCake(cake){
if(cake instanceof ExampleCake)
putOnShelf((ExampleCake)cake);
else if(cake instanceof SaleCake)
giveToCustomer((SaleCake)cake);
else
putOnTable(cake);
}
Mon problème est que le Baker est codé en dur pour ne traiter certains types de gâteaux. Si de nouveaux types de gâteaux arrivent, il ne peut pas les manipuler. Y a-t-il une façon propre et générique de gérer cela, ou est-ce que le pseudo-code que j'ai ci-dessus est assez "bon" (comme dans, cela ne blesse pas vos yeux ou votre cœur)?
Merci.
On dirait que le modèle clonable, il suffit de laisser les classes 'Cake' implémenter la méthode pour se copier. –
Cela a du sens en ce qui concerne la création de gâteaux. J'ai oublié d'ajouter la partie "handleCake", que j'ai ajouté à la fin du pseudo-code. – GuitarStrum
La partie handleCake pourrait probablement être refactorisée en utilisant le modèle de visiteur. – Calculator