JavaRush /Java Blog /Random-ID /Masalah restoran pizza. Pembangun vs Dekorator.
CynepHy6
Level 34
Великий Новгород

Masalah restoran pizza. Pembangun vs Dekorator.

Dipublikasikan di grup Random-ID

Deskripsi masalahnya.

Kita perlu menulis sebuah program. Untuk restoran pizza yang ingin menyiapkan berbagai jenis pizza: Ayam, Amerika, Daging, Hawaii, Pepperoni, dll. Mari kita lihat template mana dan skenario mana yang cocok untuk memecahkan masalah ini. Secara tradisional, template Builder digunakan untuk memecahkan “masalah pizza.” Ada juga contoh penggunaan pola Dekorator, kedua pola tersebut benar, namun terdapat perbedaan dalam penggunaannya. Builder adalah template untuk membuat objek, sedangkan Dekorator digunakan untuk memodifikasi objek jadi dengan cepat. Mari kita coba memahaminya dengan contoh:

1. Pembuat Templat:

Dalam hal ini, pizza disiapkan 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 Pembuat Pizza:
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. Templat Dekorator:

Pola Dekorator digunakan untuk menambah atau menghapus fungsionalitas tambahan pada suatu objek secara dinamis tanpa mempengaruhi objek aslinya. Digunakan saat bahan dasar pizza disiapkan terlebih dahulu dan kemudian berbagai bahan ditambahkan. Di sini kita memerlukan antarmuka (Pizza) untuk BasePizza (komponen dasar) yang ingin kita hias dan kelas PizzaDecorator yang benar-benar mengimplementasikan antarmuka tersebut.
Antarmuka pizza:
public interface Pizza { public String bakePizza(); public float getCost(); }
Implementasi di BasePizza:
public class BasePizza implements Pizza{ public String bakePizza() { return "Basic Pizza"; } public float getCost(){ return 100; } }
Kelas Dekorasi Pizza:
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 dekorator: Jamur 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; } }
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); } }

Perbedaan

Pola seperti Builder dan Factory (dan Pabrik Abstrak) digunakan dalam pembuatan objek baru. Dan pola seperti Dekorator (juga dikenal sebagai Pola Desain Struktural) digunakan untuk perluasan atau memberikan perubahan struktural pada objek yang sudah dibuat. Kedua jenis pola ini terutama mendorong komposisi melalui pewarisan, dan perbedaannya tidak cukup signifikan untuk menjamin penggunaan Builder dan bukan Dekorator. Keduanya memberikan perilakunya sendiri saat dijalankan, bukan mewarisinya. Dalam satu kasus lebih baik menggunakan Builder - jika kita ingin membatasi pembuatan objek dengan properti/fungsi tertentu. Misalnya ada 4-5 atribut yang harus diset sebelum membuat suatu objek, atau kita ingin membekukan pembuatan suatu objek hingga atribut tertentu belum diset. Sederhananya, gunakan itu alih-alih konstruktor - seperti yang ditulis Joshua Bloch di Java: Effective Programming, 2nd ed. Pembangun menyediakan atribut yang seharusnya dimiliki oleh objek yang dihasilkan tetapi menyembunyikan cara mengaturnya. Dekorator digunakan untuk menambahkan properti baru ke objek yang sudah ada saat membuat objek baru berdasarkan properti tersebut. Tidak ada batasan untuk membekukan suatu objek saat semua fiturnya ditambahkan. Kedua templat tersebut menggunakan komposisi dan mungkin terlihat serupa. Perbedaan utamanya terletak pada penggunaannya.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION