JavaRush /Java blogi /Random-UZ /Java dekorator naqsh

Java dekorator naqsh

Guruhda nashr etilgan
Kitobda "Birinchi navbatda bosh. Erik Friman va Elizabeth Robson tomonidan yaratilgan "Dizayn naqshlari" uni quyidagicha ta'riflaydi: Dekorator naqshlari ob'ektga dinamik ravishda yangi imkoniyatlar beradi va funksionallikni kengaytirish uchun pastki sinflarga muqobildir. Keling, misol yordamida ushbu ta'rifni batafsilroq ko'rib chiqishga harakat qilaylik. Aytaylik, siz yana bir zamonaviy dinni yaratdingiz va odamlarga tegishli xizmatlarni taqdim etishni rejalashtiryapsiz. Chunki zamonaviy tendentsiyalar vegetarianizm, ekologiya, inson rivojlanishiga intiladi va negadir odamlarni "an'anaviy" dinlar (yoki oxir-oqibat ateizm) qoniqtirmaydi, keyin siz asosiy oqimga ergashib, boshqa Yangi asr dinini (mavjud dinlardan o'ziga xos sintez) yaratasiz. dinlar, har biridan o'ziga yoqqan narsalarni olish). Boshida siz quyidagi xizmatlarni ko'rsatasiz: 1. Folbinlik 2. Munajjimlar bashorati Ya'ni. hamma narsa shunday ko'rinadi: Albatta narxi bilan xizmat interfeysi :) va tavsifi bor
public interface Service {
    public double getPrice();
    public String getLabel();
}
va xizmatlar
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;
    }
}
Shunga ko'ra, 2 ta buyurtma paydo bo'ldi (Tarot kartalari bilan folbinlik va mijozning shaxsiy munajjimlar bashorati):
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);
}
va dastur natijasi:
10000.0
Hammasi yaxshi bo'lardi, lekin sizlarga o'xshaganlar allaqachon yuzlab, minglab bo'lsa, odamlarning ma'naviyatini rivojlantirishda davom etishimiz kerak, aks holda ular endi qiziqmaydi. Shu sababli, joriy xizmatlarga qo'shimcha variantlar variant sifatida taklif qilindi. Masalan, folbinlik xizmatini (Tarot yoki qahva maydonchalari) tanlashda qo'shimcha variant sifatida siz chakralar yoki auraning xususiyatlarini (har birining o'z narxi bilan) buyurtma qilishingiz mumkin. Mavjud xizmat sinflariga o'zgartirish kiritmaslik uchun buni qanday amalga oshirish mumkin, bu erda hamma narsa allaqachon sozlangan va to'g'ri hisoblangan. Joriy fol ochish uchun siz bashorat + chakralar yoki bashorat + aura qo'shimcha sinflarini yaratishingiz mumkin:
public class Divination implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithChakras implements Service {
    // Здесь своя стоимость и другие методы
}
public class DivinationWithAura implements Service {
    // Здесь своя стоимость и другие методы
}
yoki faqat pastki sinfdan foydalaning, ya'ni. ota-onalar sinfini bolalar sinfiga kengaytirish
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);
    }
    // Здесь своя стоимость и другие методы
}
Ammo kamchiliklar darhol ko'rinadi, butun dunyo ma'naviyatini rivojlantiradi, bizda yangi qo'shimcha variantlar bo'lishi mumkin, bu yangi sinflarni anglatadi va agar biz hali ham hozirgilarini birlashtirishimiz kerak bo'lsa, unda sinflar tez o'sib boradi, hech bo'lmaganda bizda endi yo'q. Alohida-alohida emas, balki ikkita variant bilan birgalikda folbinlik sinfi etarli:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Bu erda siz Java-da "tejamkor" Dekorator naqshidan foydalanishingiz mumkin. Buning uchun biz qo'shimcha variantlar uchun sinf yaratamiz, u ham Xizmatni amalga oshiradi, balki Xizmatni ham o'z ichiga oladi. Va shunga ko'ra, biz folbinlik uchun buyurtma berishimiz kerak bo'lganda va hatto ikkita variant birgalikda shunday bo'ladi: Interfeys boshidanoq bo'lgani kabi.
public interface Service {
    public double getPrice();
    public String getLabel();
}
2 ta xizmatlar, avvalgidek:
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;
    }
}
Qo'shimcha variantlar uchun dekorativ
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();
    }
}
Va variantlarning o'zi (hozircha 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);
    }
}
Xo'sh, buyurtmaning o'zi
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
asosiy xizmat va 2 ta qo'shimcha variant yig'indisi natijasini beradi. Bu har bir qo'shimchaga ehtiyoj yo'qligini anglatadi yangi sinf yaratish uchun variant (yoki ikkalasining kombinatsiyasi). Bundan tashqari, ushbu variantlar nafaqat Fortune telling xizmatiga, balki Horoscope xizmatiga ham qo'llanilishi mumkin. Shuning uchun, yaqin kelajakda biz quyidagi qo'shimcha variantlarni amalga oshirishimiz kerak bo'lganda: - ijtimoiy tarmoqlardagi avatar hamkorlarining mosligi - masofaviy kanalizatsiya orqali pul oqimini yaxshilash, biz faqat ikkita qo'shimcha sinf yozishimiz kerak bo'ladi:
public class Channeling extends OptionDecorator {
    public Channeling(Service service) {
        super(service, "Полет в Поле Чудес", 99999);
    }
}
public class Avatar extends OptionDecorator {
    public Avatar(Service service) {
        super(service, "Ваша любовь в соц сетях", 5555);
    }
}
va ularni istalgan xizmatga qo'shishingiz mumkin:
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());
}
va dasturning natijasi (bu bizga kerak):
3000.0
106554.0
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION