Это, наверное, плохой пример, но, пожалуйста, работайте с ним. У меня есть класс супер Cake
и два подкласса: ExampleCake
и SaleCake
. У меня также есть Baker
, который может переделать пирог, чтобы испечь его копию, и знает, что с ним делать потом.Как вы делаете различия в дескрипторах класса утилиты в подклассах?
(Все псевдокод)
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);
}
Пекарь должен знать, как обращаться общие торты, ExampleCakes и SaleCakes. Поэтому его функции bakeCake выглядеть примерно так:
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);
}
Моя проблема состоит в том, что Бейкер зашиты только обрабатывать определенные виды тортов. Если появятся новые виды тортов, он не сможет справиться с ними. Есть ли чистый, общий способ справиться с этим, или это псевдокод, который у меня выше, достаточно «достаточно хороший» (как, например, это не повредит вашим глазам или сердцем)?
Спасибо.
Кажется, что клонированный узор вам просто нужно, чтобы классы 'Cake' реализовали метод для копирования. –
Имеет смысл, насколько создается торт. Я забыл добавить часть «handleCake», которую я добавил в конец псевдокода. – GuitarStrum
Возможно, часть handleCake может быть реорганизована с использованием шаблона посетителя. – Calculator