JavaRush /Blog Java /Random-MS /Corak Penghias Java

Corak Penghias Java

Diterbitkan dalam kumpulan
Dalam buku “Kepala Didahulukan. Corak Reka Bentuk” oleh Eric Freeman dan Elizabeth Robson mentakrifkannya seperti berikut: Corak Penghias secara dinamik menyediakan keupayaan baharu kepada objek dan merupakan alternatif kepada subkelas untuk melanjutkan fungsi. Mari cuba lihat definisi ini dengan lebih terperinci menggunakan contoh. Katakan anda telah mencipta satu lagi agama moden dan merancang untuk menyediakan perkhidmatan yang sepadan kepada orang ramai. Kerana trend moden mengejar vegetarianisme, ekologi, pembangunan manusia, dan atas sebab tertentu orang tidak berpuas hati dengan agama "tradisional" (atau ateisme pada akhirnya), maka anda, mengikuti arus perdana, mencipta satu lagi agama New Age (sejenis sintesis daripada yang sedia ada. agama, mengambil dari masing-masing apa yang serupa). Pada mulanya anda menyediakan perkhidmatan berikut: 1. Meramal 2. Horoskop Ie. semuanya kelihatan seperti ini: Terdapat antara muka perkhidmatan dengan harga sudah tentu :) dan penerangan
public interface Service {
    public double getPrice();
    public String getLabel();
}
dan perkhidmatan
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 itu, 2 pesanan muncul (meramal dengan kad Tarot dan horoskop peribadi dari pelanggan):
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 program:
10000.0
Semuanya akan baik-baik saja, tetapi sudah ada beratus-ratus, jika tidak beribu-ribu, seperti anda, dan kita perlu terus membangunkan kerohanian orang, jika tidak, mereka tidak lagi berminat. Oleh itu, pilihan tambahan kepada perkhidmatan semasa ditawarkan sebagai pilihan. Sebagai contoh, apabila memilih perkhidmatan ramalan nasib (Tarot atau serbuk kopi), sebagai pilihan tambahan anda boleh memesan ciri-ciri chakra atau aura (dengan kos mereka sendiri untuk setiap satu). Bagaimanakah ini boleh dilaksanakan supaya tidak membuat perubahan pada kelas perkhidmatan sedia ada, di mana semuanya sudah dikonfigurasikan dan dikira dengan betul. Anda boleh membuat kelas tambahan Ramalan + Chakra atau Ramalan + Aura kepada Ramalan semasa:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
atau hanya gunakan subkelas, i.e. melanjutkan kelas induk kepada 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);
    }
    // Здесь своя стоимость и другие методы
}
Tetapi kelemahannya segera dapat dilihat, membangunkan kerohanian seluruh dunia, kita mungkin mempunyai pilihan tambahan baru, yang bermaksud kelas baru, dan jika kita masih perlu menggabungkan yang semasa, maka kelas akan berkembang pesat, sekurang-kurangnya kita tidak lagi mempunyai cukup kelas Fortune memberitahu dengan dua pilihan bersama-sama, dan bukan secara berasingan secara berasingan:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Di sinilah anda boleh menggunakan corak Penghias yang sangat "menjimatkan" di Jawa. Untuk melakukan ini, kami akan membuat kelas untuk pilihan tambahan, yang juga akan melaksanakan Perkhidmatan, tetapi juga mengandungi Perkhidmatan. Dan sewajarnya, apabila kita perlu membuat pesanan untuk meramal dan walaupun dengan 2 pilihan bersama-sama, ia akan kelihatan seperti ini: Antara muka adalah seperti dari awal lagi
public interface Service {
    public double getPrice();
    public String getLabel();
}
2 kelas perkhidmatan, 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;
    }
}
Penghias untuk pilihan 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 pilihan itu sendiri (2 setakat ini):
public class Aura extends OptionDecorator {
    public Aura(Service service) {
        super(service, "Характеристика ауры", 1500);
    }
}
public class Chakra extends OptionDecorator {
    public Chakra(Service service) {
        super(service, "Характеристика чакр", 500);
    }
}
Nah, pesanan itu 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 jumlah perkhidmatan utama dan 2 pilihan tambahan. Ini bermakna bahawa tidak ada keperluan untuk setiap tambahan pilihan (atau gabungan kedua-duanya) untuk mencipta kelas baharu. Di samping itu, pilihan ini boleh digunakan bukan sahaja untuk perkhidmatan memberitahu Fortune, tetapi juga untuk perkhidmatan Horoskop. Oleh itu, apabila dalam masa terdekat kami perlu melaksanakan pilihan tambahan berikut: - keserasian rakan kongsi avatar di rangkaian sosial - meningkatkan aliran tunai melalui penyaluran jauh, kami perlu menulis hanya 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 boleh menambahkannya pada mana-mana perkhidmatan:
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 kami perlukan):
3000.0
106554.0
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION