JavaRush /Java Blog /Random-TL /Mga problema sa pizzeria. Tagabuo kumpara sa Dekorador.
CynepHy6
Antas
Великий Новгород

Mga problema sa pizzeria. Tagabuo kumpara sa Dekorador.

Nai-publish sa grupo

Paglalarawan ng problema.

Kailangan nating magsulat ng isang programa. Para sa isang pizzeria na gustong maghanda ng iba't ibang uri ng pizza: Chicken, American, Meat, Hawaiian, Pepperoni, atbp. Tingnan natin kung aling template at sa ilalim kung aling senaryo ang angkop para sa paglutas ng problemang ito. Ayon sa kaugalian, ginagamit ang template ng Tagabuo upang malutas ang "mga problema sa pizza." Mayroon ding mga halimbawa ng paggamit ng pattern ng Dekorador, ang parehong mga pattern ay tama, ngunit may mga pagkakaiba sa paggamit. Ang Tagabuo ay isang template para sa paglikha ng mga bagay, habang ang Dekorador ay ginagamit upang baguhin ang natapos na bagay sa mabilisang. Subukan nating unawain ito gamit ang mga halimbawa:

1. Tagabuo ng Template:

Sa kasong ito, ang pizza ay inihanda kasama ang lahat ng mga sangkap nang sabay-sabay.
klase ng 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 na klase ng 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(); }
klase ng 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(); } }
Pagsusulit sa klase:
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. Template ng Dekorador:

Ginagamit ang pattern ng Dekorador upang magdagdag o mag-alis ng karagdagang functionality sa isang bagay nang pabago-bago nang hindi naaapektuhan ang orihinal na bagay. Ginagamit kapag ang ilang base ng pizza ay inihanda muna at pagkatapos ay idinagdag ang iba't ibang sangkap. Dito kailangan namin ng isang interface (Pizza) para sa BasePizza (ang pangunahing bahagi) na gusto naming palamutihan at isang klase ng PizzaDecorator na aktwal na nagpapatupad ng interface.
Interface ng pizza:
public interface Pizza { public String bakePizza(); public float getCost(); }
Pagpapatupad sa BasePizza:
public class BasePizza implements Pizza{ public String bakePizza() { return "Basic Pizza"; } public float getCost(){ return 100; } }
Klase ng 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 dekorador: Mushroom at 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; } }
Pagsusulit sa klase:
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); } }

Mga Pagkakaiba

Ang mga pattern tulad ng Builder at Factory (at Abstract Factory) ay ginagamit sa paglikha ng mga bagong bagay. At ang mga pattern tulad ng Decorator (kilala rin bilang Structural Design Pattern) ay ginagamit para sa pagpapalawak o upang magbigay ng mga pagbabago sa istruktura sa mga nagawa nang bagay. Ang parehong uri ng mga pattern ay pangunahing nagpo-promote ng komposisyon sa pamamagitan ng pamana, at ang mga pagkakaiba ay hindi sapat na makabuluhan upang matiyak ang paggamit ng isang Tagabuo sa halip na isang Dekorador. Parehong nagbibigay ng kanilang sariling pag-uugali kapag naisakatuparan, sa halip na magmana nito. Sa isang kaso mas mainam na gamitin ang Tagabuo - kung gusto nating limitahan ang paglikha ng mga bagay na may ilang mga katangian/function. Halimbawa, mayroong 4-5 attribute na dapat itakda bago gumawa ng object, o gusto naming i-freeze ang paggawa ng object hanggang sa maitakda pa ang ilang attribute. Sa madaling salita, gamitin ito sa halip na isang constructor - gaya ng isinulat ni Joshua Bloch sa Java: Effective Programming, 2nd ed. Ibinibigay ng tagabuo ang mga katangian na dapat mayroon ang nabuong bagay ngunit itinatago kung paano itakda ang mga ito. Ang isang dekorador ay ginagamit upang magdagdag ng mga bagong katangian sa isang umiiral na bagay kapag gumagawa ng isang bagong bagay batay dito. Walang mga paghihigpit sa pagyeyelo ng isang bagay habang ang lahat ng mga tampok nito ay idinaragdag. Ang parehong mga template ay gumagamit ng komposisyon at maaaring magkamukha. Ang pangunahing pagkakaiba ay sa kanilang paggamit.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION