JavaRush /مدونة جافا /Random-AR /نمط ديكور جافا

نمط ديكور جافا

نشرت في المجموعة
في كتاب "الرأس أولاً". يحددها "أنماط التصميم" من تأليف إريك فريمان وإليزابيث روبسون على النحو التالي: يوفر نمط الديكور ديناميكيًا إمكانات جديدة لكائن ما وهو بديل للفئة الفرعية لتوسيع الوظائف. دعونا نحاول إلقاء نظرة على هذا التعريف بمزيد من التفصيل باستخدام مثال. لنفترض أنك أنشأت دينًا حديثًا آخر وتخطط لتزويد الناس بالخدمات المناسبة. لأن الاتجاهات الحديثة تتبع النظام النباتي، والبيئة، والتنمية البشرية، ولسبب ما لا يكون الناس راضين عن الديانات "التقليدية" (أو الإلحاد في النهاية)، ثم تقوم، باتباع الاتجاه السائد، بإنشاء دين آخر للعصر الجديد (نوع من التوليف من الموجود الأديان، يأخذون من كل ما مثله). في البداية تقوم بتقديم الخدمات التالية: 1. الكهانة 2. الأبراج أي. يبدو كل شيء على النحو التالي: هناك واجهة خدمة بسعر بالطبع :) ووصف
public interface Service {
    public double getPrice();
    public String getLabel();
}
والخدمات
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;
    }
}
حسنًا، وفقًا لذلك، ظهر أمران (قراءة الطالع باستخدام بطاقات التاروت وبرجك الشخصي من العميل):
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);
}
و نتيجة البرنامج:
10000.0
سيكون كل شيء على ما يرام، ولكن هناك بالفعل المئات، إن لم يكن الآلاف، مثلك، ونحن بحاجة إلى الاستمرار في تطوير روحانية الناس، وإلا فلن يكونوا مهتمين بعد الآن. ولذلك، تم تقديم خيارات إضافية للخدمات الحالية كخيار. على سبيل المثال، عند اختيار خدمة الكهانة (التارو أو القهوة)، كخيار إضافي، يمكنك طلب خصائص الشاكرات أو الهالة (مع تكلفتها الخاصة لكل منها). كيف يمكن تنفيذ ذلك حتى لا يتم إجراء تغييرات على فئات الخدمة الحالية، حيث تم بالفعل تكوين كل شيء وحسابه بشكل صحيح. يمكنك إنشاء فئات إضافية العرافة + الشاكرات أو العرافة + الهالة إلى العرافة الحالية:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
أو مجرد استخدام فئة فرعية، أي. توسيع فئة الوالدين إلى فئة الطفل
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);
    }
    // Здесь своя стоимость и другие методы
}
لكن العيوب مرئية على الفور، وتطوير روحانية العالم بأسره، قد يكون لدينا خيارات إضافية جديدة، مما يعني فصول جديدة، وإذا كنا لا نزال بحاجة إلى الجمع بين الفئات الحالية، فسوف تنمو الفصول بسرعة، على الأقل لم يعد لدينا ما يكفي من فئة الكهانة مع خيارين معًا، وليس بشكل منفصل:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
هذا هو المكان الذي يمكنك فيه استخدام نمط الديكور "الموفر" للغاية في Java. للقيام بذلك، سنقوم بإنشاء فئة للخيارات الإضافية، والتي ستقوم أيضًا بتنفيذ الخدمة، ولكنها تحتوي أيضًا على الخدمة. وبناء على ذلك، عندما نحتاج إلى تقديم طلب لقراءة الطالع وحتى مع وجود خيارين معًا، سيبدو الأمر كما يلي: الواجهة كما كانت منذ البداية
public interface Service {
    public double getPrice();
    public String getLabel();
}
فئتان من الخدمات، كما كانت من قبل:
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;
    }
}
ديكور للحصول على خيارات إضافية
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();
    }
}
والخيارات نفسها (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);
    }
}
حسنا، النظام نفسه
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
مما يعطي نتيجة مجموع الخدمة الرئيسية وخيارين إضافيين. وهذا يعني أنه ليست هناك حاجة لكل إضافية الخيار (أو مزيج من الاثنين معا) لإنشاء فئة جديدة. بالإضافة إلى ذلك، يمكن تطبيق هذه الخيارات ليس فقط على خدمة Fortune Telling، ولكن أيضًا على خدمة Horscope. لذلك، عندما نحتاج في المستقبل القريب إلى تنفيذ الخيارات الإضافية التالية: - توافق شركاء الصورة الرمزية على الشبكات الاجتماعية - تحسين التدفق النقدي من خلال التوجيه عن بعد، سنحتاج إلى كتابة فئتين إضافيتين فقط:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
ويمكنك إضافتها إلى أي خدمة:
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());
}
ونتيجة البرنامج (الذي نحتاجه):
3000.0
106554.0
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION