Pola Desain Dekorator
Saya dapat mengutamakan diri saya sendiri, bahkan setelah itu jika saya mau
Kami memiliki antarmuka yang disebut Pembayaran berisi metode pembayaran .
Dan DefaultPayment kelas konkret untuk mengimplementasikan metode, metode mengambil harga sebagai argumen untuk melakukan logika pembayaran.
public interface Payment {
void pay(BigDecimal price);
}
public class DefaultPayment implements Payment {
@Override
public void pay(BigDecimal price) {
System.out.println("Payed: " + price);
}
}
public class Client {
public static void main(String[] args) {
Payment defaultPayment = new DefaultPayment();
defaultPayment.pay(BigDecimal.valueOf(100));
}
}
Katakanlah ada pajak untuk produk yang ingin saya bayar, apa yang dapat saya lakukan?
Kami dapat memanfaatkan desain kami, kami merancang untuk antarmuka bukan untuk implementasi.
Jadi, kita dapat membuat kelas untuk Pembayaran dan menjadikannya jenis Pembayaran dan pada saat yang sama menahan Pembayaran sebagai properti, dan dapat menerima pembayaran menggunakan konstruktornya, dan kita akan memanggil kelas ini TaxPaymentDecorator .
public class TaxPaymentDecorator implements Payment {
private Payment payment;
private BigDecimal tax = BigDecimal.ZERO;
public TaxPaymentDecorator(Payment payment) {
this.payment = payment;
}
@Override
public void pay(BigDecimal price) {
price = price.add(this.tax);
payment.pay(price);
}
public BigDecimal getTax() {
return tax;
}
public void setTax(BigDecimal tax) {
this.tax = tax;
}
}
Dan klien dapat menggunakan TaxPaymentDecorator sebagai berikut:
public class Client {
public static void main(String[] args) {
TaxPaymentDecorator taxPaymentDecorator = new TaxPaymentDecorator(new DefaultPayment());
taxPaymentDecorator.setTax(BigDecimal.valueOf(50));
taxPaymentDecorator.pay(BigDecimal.valueOf(100));
}
}
public class DiscountPaymentDecorator implements Payment {
private Payment payment;
private BigDecimal discount = BigDecimal.ZERO;
public DiscountPaymentDecorator(Payment payment) {
this.payment = payment;
}
@Override
public void pay(BigDecimal price) {
price = price.subtract(discount);
payment.pay(price);
}
public BigDecimal getDiscount() {
return discount;
}
public void setDiscount(BigDecimal discount) {
this.discount = discount;
}
}
public class Client {
public static void main(String[] args) {
TaxPaymentDecorator taxPaymentDecorator = new TaxPaymentDecorator(new DefaultPayment());
taxPaymentDecorator.setTax(BigDecimal.valueOf(50));
DiscountPaymentDecorator discountPaymentDecorator = new DiscountPaymentDecorator(taxPaymentDecorator);
discountPaymentDecorator.setDiscount(BigDecimal.valueOf(10));
discountPaymentDecorator.pay(BigDecimal.valueOf(100));
}
}
diagram UML
Prinsip desain
Saya akan membahas tiga prinsip desain di sini:
- Desain untuk antarmuka bukan untuk implementasi: Seperti yang Anda lihat, menggunakan antarmuka Pembayaran membantu kami menggunakan kekuatan OOP dengan menambahkan perilaku secara dinamis pada waktu proses tanpa modifikasi apa pun untuk implementasi lama.
- Jadikan desain Anda terbuka untuk ekstensi tutup untuk modifikasi: Poin ini terkait dengan yang sebelumnya, implementasi lama kami tidak memaksa kami untuk melakukan modifikasi apa pun, tetapi kami memperluas implementasi lama untuk menambahkan perilaku baru, dan maksud saya di sini menggunakan antarmuka sebagai gantinya desain untuk implementasi.
- Lebih suka komposisi daripada pewarisan: dekorator menggunakan komposisi di sini alih-alih mencoba menggunakan pewarisan, secara umum menggunakan pewarisan dapat menyebabkan masalah dengan menambah kopling, dan kita dapat mendiskusikannya di blog terpisah.
Lampirkan tanggung jawab tambahan ke objek secara dinamis. Dekorator memberikan alternatif yang fleksibel untuk sub-klasifikasi untuk memperluas fungsionalitas.
Dalam contoh kami, kami melampirkan dua tanggung jawab secara dinamis saat runtime, kami menambahkan pajak pada harga dan mengurangi diskon dari harga, kami tidak melakukan sub-klasifikasi untuk DefaultPayment, kami menggunakan kekuatan OOP untuk menambahkan perilaku kami dengan cara yang fleksibel, dan itulah Pola Dekorator .

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































