JavaRush /Java Blog /Random-ID /Pola Dekorator Java

Pola Dekorator Java

Dipublikasikan di grup Random-ID
Dalam buku “Kepala Pertama. Design Patterns” oleh Eric Freeman dan Elizabeth Robson mendefinisikannya sebagai berikut: Pola Dekorator secara dinamis memberikan kemampuan baru pada suatu objek dan merupakan alternatif subkelas untuk memperluas fungsionalitas. Mari kita coba melihat definisi ini lebih detail dengan menggunakan sebuah contoh. Misalkan Anda telah mendirikan agama modern lainnya dan berencana untuk memberikan layanan yang sesuai kepada masyarakat. Karena tren modern mengejar vegetarianisme, ekologi, pembangunan manusia, dan karena alasan tertentu orang tidak puas dengan agama “tradisional” (atau pada akhirnya ateisme), maka Anda, mengikuti arus utama, menciptakan agama New Age yang lain (semacam sintesis dari yang sudah ada). agama, mengambil dari masing-masing apa yang disukainya). Pada awalnya Anda memberikan layanan berikut: 1. Ramalan 2. Horoskop Yaitu. semuanya terlihat seperti ini: Ada antarmuka layanan dengan harga tentunya :) dan deskripsi
public interface Service {
    public double getPrice();
    public String getLabel();
}
dan layanan
public class Divination implements Service {
    private String label;
    private double price;

    public Divination(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
public class Horoscope implements Service {
    private String label;
    private double price;

    public Horoscope(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
Oleh karena itu, 2 pesanan muncul (ramalan dengan kartu Tarot dan horoskop pribadi dari klien):
public static void main(String[] args) {
    double cost;
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    // И персональный гороскоп
    Service personalHoroscope = new Horoscope("Персональный гороскоп", 9000);
    cost = taro.getPrice() + personalHoroscope.getPrice();

    System.out.println(cost);
}
dan hasil dari program ini:
10000.0
Semuanya akan baik-baik saja, tetapi sudah ada ratusan, bahkan ribuan, seperti Anda, dan kami perlu terus mengembangkan spiritualitas masyarakat, jika tidak mereka tidak lagi tertarik. Oleh karena itu, opsi tambahan untuk layanan saat ini ditawarkan sebagai opsi. Misalnya saat memilih jasa meramal (Tarot atau ampas kopi), sebagai opsi tambahan Anda bisa memesan ciri-ciri cakra atau aura (dengan biaya masing-masing). Bagaimana hal ini bisa diterapkan agar tidak melakukan perubahan pada kelas layanan yang ada, dimana semuanya sudah dikonfigurasi dan dihitung dengan benar. Anda dapat membuat kelas tambahan Ramalan + Chakra atau Ramalan + Aura ke Ramalan saat ini:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
atau cukup gunakan subkelas, mis. memperluas kelas induk ke kelas anak
public class DivinationWithAura extends Divination {
    public DivinationWithAura(String label, double price) {
        super(label, price);
    }
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras extends Divination {
    public DivinationWithChakras(String label, double price) {
        super(label, price);
    }
    // Здесь своя стоимость и другие методы
}
Namun kekurangannya langsung terlihat, mengembangkan spiritualitas seluruh dunia, kita mungkin memiliki pilihan tambahan baru, yang berarti kelas-kelas baru, dan jika kita masih perlu menggabungkan yang sudah ada, maka kelas-kelas tersebut akan berkembang pesat, setidaknya kita tidak lagi memilikinya. cukuplah kelas meramal dengan dua pilihan secara bersamaan, dan tidak terpisah-pisah:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Di sinilah Anda dapat menggunakan pola Dekorator yang sangat “hemat” di Java. Untuk melakukan ini, kita akan membuat kelas untuk opsi tambahan, yang juga akan mengimplementasikan Layanan, tetapi juga berisi Layanan. Oleh karena itu, ketika kita perlu melakukan pemesanan ramalan dan bahkan dengan 2 pilihan secara bersamaan, akan terlihat seperti ini: Antarmukanya seperti semula sejak awal
public interface Service {
    public double getPrice();
    public String getLabel();
}
2 kelas layanan, sama seperti sebelumnya:
public class Divination implements Service {
    private String label;
    private double price;

    public Divination(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
public class Horoscope implements Service {
    private String label;
    private double price;

    public Horoscope(String label, double price) {
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price;
    }

    public String getLabel() {
        return this.label;
    }
}
Dekorator untuk opsi tambahan
public class OptionDecorator implements Service {
    private Service service;
    private String label;
    private double price;

    public OptionDecorator(Service service, String label, double price) {
        this.service = service;
        this.label = label;
        this.price = price;
    }

    public double getPrice() {
        return this.price + service.getPrice();
    }

    public String getLabel() {
        return this.label + service.getLabel();
    }
}
Dan opsinya sendiri (sejauh ini ada 2):
public class Aura extends OptionDecorator {
    public Aura(Service service) {
        super(service, "Характеристика ауры", 1500);
    }
}
public class Chakra extends OptionDecorator {
    public Chakra(Service service) {
        super(service, "Характеристика чакр", 500);
    }
}
Ya, pesanannya sendiri
public static void main(String[] args) {
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    Service chakra = new Chakra(taro);
    Service aura = new Aura(chakra);

    // И общая стоимость
    System.out.println(aura.getPrice());
}
3000.0
yang memberikan hasil penjumlahan layanan utama dan 2 opsi tambahan. Artinya, tidak diperlukan setiap tambahan pilihan (atau kombinasi keduanya) untuk membuat kelas baru. Selain itu, opsi ini dapat diterapkan tidak hanya pada layanan Ramalan, tetapi juga pada layanan Horoskop. Oleh karena itu, ketika dalam waktu dekat kami perlu menerapkan opsi tambahan berikut: - kompatibilitas mitra avatar di jejaring sosial - meningkatkan arus kas melalui saluran jarak jauh, kami hanya perlu menulis 2 kelas tambahan:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
dan Anda dapat menambahkannya ke layanan apa pun:
public static void main(String[] args) {
    // Гадание на Таро
    Service taro = new Divination("Таро", 1000);
    Service chakra = new Chakra(taro);
    Service aura = new Aura(chakra);

    // И общая стоимость
    System.out.println(aura.getPrice());

    // Гороскоп
    Service horoscope = new Horoscope("Персональный гороскоп", 1000);
    Service channenling = new Channeling(horoscope);
    Service avatar = new Avatar(channenling);

    // И общая стоимость
    System.out.println(avatar.getPrice());
}
dan hasil program (yang kita perlukan):
3000.0
106554.0
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION