JavaRush /Blog Java /Random-MS /Masalah pizza. Pembina vs Penghias.
CynepHy6
Tahap
Великий Новгород

Masalah pizza. Pembina vs Penghias.

Diterbitkan dalam kumpulan

Penerangan masalah.

Kita perlu menulis program. Untuk restoran pizza yang ingin menyediakan pelbagai jenis piza: Ayam, Amerika, Daging, Hawaii, Pepperoni, dll. Mari lihat templat dan di bawah senario mana yang sesuai untuk menyelesaikan masalah ini. Secara tradisinya, templat Builder digunakan untuk menyelesaikan "masalah pizza." Terdapat juga contoh penggunaan corak Penghias, kedua-dua corak adalah betul, tetapi terdapat perbezaan penggunaan. Pembina ialah templat untuk mencipta objek, manakala Penghias digunakan untuk mengubah suai objek siap dengan cepat. Mari cuba fahami ini dengan contoh:

1. Pembina Templat:

Dalam kes ini, pizza disediakan dengan semua bahan sekaligus.
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(); } }
Ujian 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. Templat Penghias:

Corak Penghias digunakan untuk menambah atau mengalih keluar fungsi tambahan pada objek secara dinamik tanpa menjejaskan objek asal. Digunakan apabila beberapa asas pizza disediakan terlebih dahulu dan kemudian pelbagai bahan ditambah. Di sini kita memerlukan antara muka (Pizza) untuk BasePizza (komponen asas) yang ingin kita hiaskan dan kelas PizzaDecorator yang sebenarnya melaksanakan antara muka.
Antara muka pizza:
public interface Pizza { public String bakePizza(); public float getCost(); }
Pelaksanaan dalam 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 penghias: Cendawan dan 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; } }
Ujian 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); } }

Perbezaan

Corak seperti Pembina dan Kilang (dan Kilang Abstrak) digunakan dalam penciptaan objek baharu. Dan corak seperti Penghias (juga dikenali sebagai Corak Reka Bentuk Struktur) digunakan untuk kebolehlanjutan atau untuk memberikan perubahan struktur kepada objek yang telah dibuat. Kedua-dua jenis corak terutamanya mempromosikan gubahan melalui pewarisan, dan perbezaannya tidak cukup ketara untuk menjamin penggunaan Pembina dan bukannya Penghias. Kedua-duanya memberikan tingkah laku mereka sendiri apabila dilaksanakan, dan bukannya mewarisinya. Dalam satu kes, lebih baik menggunakan Builder - jika kita ingin mengehadkan penciptaan objek dengan sifat/fungsi tertentu. Sebagai contoh, terdapat 4-5 atribut yang mesti ditetapkan sebelum mencipta objek, atau kami ingin membekukan penciptaan objek sehingga atribut tertentu ditetapkan lagi. Ringkasnya, gunakannya dan bukannya pembina - seperti yang ditulis Joshua Bloch dalam Java: Effective Programming, 2nd ed. Pembina menyediakan atribut yang sepatutnya ada pada objek yang dihasilkan tetapi menyembunyikan cara menetapkannya. Penghias digunakan untuk menambah sifat baharu pada objek sedia ada apabila mencipta objek baharu berdasarkannya. Tiada sekatan untuk membekukan objek semasa semua cirinya sedang ditambah. Kedua-dua templat menggunakan komposisi dan mungkin kelihatan serupa. Perbezaan utama adalah dalam penggunaannya.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION