JavaRush /Java Blogu /Random-AZ /Java Dekorator Modeli

Java Dekorator Modeli

Qrupda dərc edilmişdir
Kitabda “Əvvəlcə baş. Eric Freeman və Elizabeth Robson tərəfindən dizayn nümunələri bunu aşağıdakı kimi müəyyən edir: Dekorator nümunəsi dinamik olaraq obyektə yeni imkanlar təqdim edir və funksionallığı genişləndirmək üçün alt siniflərə alternativdir. Bir nümunədən istifadə edərək bu tərifə daha ətraflı baxmağa çalışaq. Tutaq ki, siz daha bir müasir din yaratmısınız və insanlara müvafiq xidmətlər göstərməyi planlaşdırırsınız. Çünki müasir cərəyanlar vegetarianlığı, ekologiyanı, insan inkişafının arxasınca gedir və nədənsə insanları “ənənəvi” dinlər (yaxud son nəticədə ateizm) qane etmir, onda siz əsas cərəyanı izləyərək başqa bir Yeni Əsrin dini (mövcud dinlərdən bir növ sintez) yaradırsınız. dinlər, hər birindən bəyəndiklərini alaraq). Başlanğıcda siz aşağıdakı xidmətləri göstərirsiniz: 1. Falçılıq 2. Bürclər, yəni. hər şey belə görünür: Əlbəttə ki, qiyməti olan bir xidmət interfeysi var :) və təsviri
public interface Service {
    public double getPrice();
    public String getLabel();
}
və xidmətlər
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;
    }
}
Yaxşı, müvafiq olaraq, 2 sifariş ortaya çıxdı (Tarot kartları ilə falçılıq və müştərinin şəxsi ulduz falı):
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);
}
və proqramın nəticəsi:
10000.0
Hər şey yaxşı olardı, amma artıq sizin kimi yüzlərlə, minlərlə olmasa da, var və biz insanların mənəviyyatını inkişaf etdirməyə davam etməliyik, əks halda onlar artıq maraqlanmırlar. Buna görə də, opsiya kimi mövcud xidmətlərə əlavə variantlar təklif edilmişdir. Məsələn, falçılıq xidmətini (Tarot və ya qəhvə meydançası) seçərkən əlavə seçim olaraq çakraların və ya auranın xüsusiyyətlərini sifariş edə bilərsiniz (hər biri üçün öz qiyməti ilə). Hər şeyin artıq konfiqurasiya edildiyi və düzgün hesablandığı mövcud xidmət siniflərinə dəyişiklik etməmək üçün bunu necə həyata keçirmək olar. Siz cari Kehanetə əlavə Kehanet + Çakralar və ya Falçılıq + Aura sinifləri yarada bilərsiniz:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
və ya sadəcə alt siniflərdən istifadə edin, yəni. valideyn sinfini uşaq sinfinə uzatmaq
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);
    }
    // Здесь своя стоимость и другие методы
}
Ancaq çatışmazlıqlar dərhal görünür, bütün dünyanın mənəviyyatını inkişaf etdirir, yeni əlavə seçimlərimiz ola bilər, bu da yeni siniflər deməkdir və əgər biz hələ də mövcud olanları birləşdirmək lazımdırsa, onda siniflər sürətlə böyüyəcək, ən azı biz artıq deyilik. Ayrı-ayrılıqda deyil, birlikdə iki variantla kifayət qədər Falçılıq sinfinə sahib olun:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Java-da çox "qənaət edən" Dekorator nümunəsindən istifadə edə biləcəyiniz yer budur. Bunun üçün biz əlavə seçimlər üçün sinif yaradacağıq ki, bu da Xidməti həyata keçirəcək, həm də Xidməti ehtiva edir. Və buna uyğun olaraq, falçılıq üçün sifariş vermək lazım olduqda və hətta 2 variant birlikdə belə görünəcək: İnterfeys əvvəldən olduğu kimidir.
public interface Service {
    public double getPrice();
    public String getLabel();
}
Əvvəlki kimi 2 xidmət sinfi:
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;
    }
}
Əlavə seçimlər üçün dekorator
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();
    }
}
Və variantların özləri (indiyə qədər 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);
    }
}
Yaxşı, sifarişin özü
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
əsas xidmətin və 2 əlavə variantın cəminin nəticəsini verən. Bu o deməkdir ki, hər bir əlavəyə ehtiyac yoxdur yeni sinif yaratmaq üçün seçim (və ya hər ikisinin birləşməsi). Bundan əlavə, bu seçimlər təkcə Falçılıq xidmətinə deyil, həm də Bürclər xidmətinə tətbiq edilə bilər. Buna görə də, yaxın gələcəkdə aşağıdakı əlavə variantları həyata keçirməli olduğumuz zaman: - sosial şəbəkələrdə avatar partnyorlarının uyğunluğu - uzaqdan kanalizasiya vasitəsilə pul axınının yaxşılaşdırılması, yalnız 2 əlavə sinif yazmalıyıq:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
və onları istənilən xidmətə əlavə edə bilərsiniz:
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());
}
və proqramın nəticəsi (bizə lazım olan):
3000.0
106554.0
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION