JavaRush /Blog Jawa /Random-JV /Masalah pizzeria. Pembina vs Dekorator.
CynepHy6
tingkat
Великий Новгород

Masalah pizzeria. Pembina vs Dekorator.

Diterbitake ing grup

Katrangan saka masalah.

Kita kudu nulis program. Kanggo pizzeria sing pengin nyiyapake macem-macem jinis pizza: Pitik, Amerika, Daging, Hawaii, Pepperoni, lsp. Ayo ndeleng cithakan endi lan skenario sing cocog kanggo ngrampungake masalah iki. Cara tradisional, template Builder digunakake kanggo ngatasi "masalah pizza." Ana uga conto nggunakake pola Dekorator, pola loro kasebut bener, nanging ana bedane nggunakake. Builder minangka cithakan kanggo nggawe obyek, dene Dekorator digunakake kanggo ngowahi obyek sing wis rampung kanthi cepet. Ayo coba mangerteni iki kanthi conto:

1. Pangembang Cithakan:

Ing kasus iki, pizza disiapake kanthi kabeh bahan bebarengan.
Kelas pizza:
public class Pizza{ private float totalPrice = 0; private Size size; private Topping topping; private Crust crust; private Cheese cheese; public Size getSize(){ return size; } public void setSize(Size size){ this.size = size; } public Topping getTopping(){ return topping; } public void setTopping(Topping topping){ this.topping = topping; } public Crust getCrust(){ return crust; } public void setCrust(Crust crust){ this.crust = crust; } public Cheese getCheese(){ return cheese; } public void setCheese(Cheese cheese){ this.cheese = cheese; } public float getTotalPrice(){ return totalPrice; } public void addToPrice(float price){ this.totalPrice = totalPrice + price; } }
4 kelas enum:
public enum Cheese { AMERICAN{ public float getCost(){ return 40; } }, ITALIAN { public float getCost(){ return 60; } }; public abstract float getCost(); } public enum Crust { THIN{ public float getCost(){ return 70; } } , STUFFED{ public float getCost(){ return 90; } }; public abstract float getCost(); } public enum Size { MEDIUM { public float getCost() { return 100; } }, LARGE { public float getCost() { return 160; } }; public abstract float getCost(); } public enum Topping { PEPPERONI { public float getCost(){ return 30; } }, CHICKEN{ public float getCost(){ return 35; } }, MUSHROOM{ public float getCost(){ return 20; } }; public abstract float getCost(); }
Kelas PizzaBuilder:
public class PizzaBuilder { Pizza pizza = new Pizza(); public PizzaBuilder withTopping(Topping topping) { pizza.setTopping(topping); pizza.addToPrice(topping.getCost()); return this; } public PizzaBuilder withSize(Size size) { pizza.setSize(size); pizza.addToPrice(size.getCost()); return this; } public PizzaBuilder withCrust(Crust crust) { pizza.setCrust(crust); pizza.addToPrice(crust.getCost()); return this; } public Pizza build() { return pizza; } public double calculatePrice() { return pizza.getTotalPrice(); } }
Tes kelas:
public class PizzaBuilderTest { @Test public void shouldBuildThinCrustChickenPizza(){ Pizza pizza = new PizzaBuilder().withCrust(Crust.THIN).withTopping(Topping.CHICKEN).withSize(Size.LARGE).build(); assertEquals(Topping.CHICKEN,pizza.getTopping()); assertEquals(Size.LARGE,pizza.getSize()); assertEquals(Crust.THIN,pizza.getCrust()); assertEquals(265.0,pizza.getTotalPrice(),0); } }

2. Cithakan Dekorator:

Pola dekorator digunakake kanggo nambah utawa mbusak fungsi tambahan menyang obyek kanthi dinamis tanpa mengaruhi obyek asli. Digunakake nalika sawetara basis pizza disiapake dhisik banjur macem-macem bahan ditambahake. Kene kita kudu antarmuka (Pizza) kanggo BasePizza (komponen dhasar) sing arep kanggo dekorasi lan kelas PizzaDecorator sing bener ngleksanakake antarmuka.
Antarmuka pizza:
public interface Pizza { public String bakePizza(); public float getCost(); }
Implementasi ing BasePizza:
public class BasePizza implements Pizza{ public String bakePizza() { return "Basic Pizza"; } public float getCost(){ return 100; } }
Kelas PizzaDecorator:
public class PizzaDecorator implements Pizza { Pizza pizza; public PizzaDecorator(Pizza newPizza) { this.pizza = newPizza; } public String bakePizza() { return pizza.bakePizza(); } @Override public float getCost() { return pizza.getCost(); } }
2 decorators: Jamur lan Pepperoni
public class Mushroom extends PizzaDecorator { public Mushroom(Pizza newPizza) { super(newPizza); } @Override public String bakePizza() { return super.bakePizza() + " with Mushroom Topings"; } @Override public float getCost() { return super.getCost()+80; } } public class Pepperoni extends PizzaDecorator { public Pepperoni(Pizza newPizza) { super(newPizza); } @Override public String bakePizza() { return super.bakePizza() + " with Pepperoni Toppings"; } @Override public float getCost() { return super.getCost()+110; } }
Tes kelas:
public class PizzaDecoratorTest { @Test public void shouldMakePepperoniPizza(){ Pizza pizza = new Pepperoni(new BasePizza()); assertEquals("Basic Pizza with Pepperoni Toppings",pizza.bakePizza()); assertEquals(210.0,pizza.getCost(),0); } }

Bedane

Pola kayata Builder lan Factory (lan Pabrik Abstrak) digunakake kanggo nggawe obyek anyar. Lan pola kayata Dekorator (uga dikenal minangka Pola Desain Struktural) digunakake kanggo ekstensibilitas utawa kanggo menehi owah-owahan struktural kanggo obyek sing wis digawe. Loro-lorone jinis pola utamane ningkatake komposisi liwat warisan, lan bedane ora cukup signifikan kanggo njamin nggunakake Pembangun tinimbang Dekorator. Loro-lorone menehi prilaku dhewe nalika dieksekusi, tinimbang warisan. Ing siji kasus iku luwih apik kanggo nggunakake Builder - yen kita arep kanggo matesi panyiptan obyek karo sifat / fungsi tartamtu. Contone, ana 4-5 atribut sing kudu disetel sadurunge nggawe obyek, utawa kita pengin beku nggawe obyek nganti atribut tartamtu wis disetel. Cukup, gunakake tinimbang konstruktor - kaya sing ditulis Joshua Bloch ing Jawa: Pemrograman Efektif, ed 2nd. Pembangun nyedhiyakake atribut sing kudu diduweni obyek sing digawe nanging ndhelikake carane nyetel. Dekorator digunakake kanggo nambah properti anyar menyang obyek sing wis ana nalika nggawe obyek anyar adhedhasar. Ora ana watesan kanggo beku obyek nalika kabeh fitur ditambahake. Loro-lorone cithakan nggunakake komposisi lan bisa uga katon padha. Bentenipun utama ing nggunakake.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION