JavaRush /Java блогы /Random-KK /Java декоратор үлгісі

Java декоратор үлгісі

Топта жарияланған
Кітапта «Алдымен бас. Дизайн үлгілері» Эрик Фриман және Элизабет Робсон оны келесідей анықтайды: Декоратор үлгісі динамикалық түрде нысанға жаңа мүмкіндіктерді береді және функционалдылықты кеңейту үшін қосалқы сыныпқа балама болып табылады. Бұл анықтаманы мысал арқылы толығырақ қарастыруға тырысайық. Сіз тағы бір заманауи дінді құрдыңыз делік және адамдарға тиісті қызметтерді көрсетуді жоспарлап отырсыз. Өйткені қазіргі заманғы тенденциялар вегетариандық, экология, адам дамуын көздейді және қандай да бір себептермен адамдар «дәстүрлі» діндерге (немесе соңында атеизмге) қанағаттанбайды, содан кейін сіз негізгі ағымға ілесе отырып, басқа Жаңа дәуір дінін (қолданыстағыдан синтез түрі) жасайсыз. діндер, әрқайсысынан ұнайтынын алу). Бастапқыда сіз келесі қызметтерді көрсетесіз: 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;
    }
}
Сәйкесінше, 2 тапсырыс пайда болды (Таро карталарымен және клиенттің жеке жұлдыз жорамалымен болжау):
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();
}
Бұрынғыдай қызметтердің 2 класы:
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
негізгі қызмет пен 2 қосымша опцияның қосындысының нәтижесін береді. Бұл әрбір қосымшаның қажеті жоқ дегенді білдіреді жаңа класс жасау үшін опция (немесе екеуінің комбинациясы). Сонымен қатар, бұл опцияларды тек «Фортуна» қызметіне ғана емес, сонымен қатар Гороскоп қызметіне де қолдануға болады. Сондықтан, жақын арада бізге келесі қосымша опцияларды енгізу қажет болғанда: - әлеуметтік желілердегі аватарлық серіктестердің үйлесімділігі - қашықтан арна арқылы ақша ағынын жақсарту, бізге тек 2 қосымша сабақ жазу керек болады:
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