JavaRush /Java блогу /Random-KY /Java Decorator Pattern

Java Decorator Pattern

Группада жарыяланган
Китепте «Биринчи баш. Эрик Фриман жана Элизабет Робсон тарабынан Дизайн үлгүлөрү аны төмөнкүчө аныктайт: Декоратор үлгүсү an objectиге жаңы мүмкүнчүлүктөрдү динамикалык түрдө камсыз кылат жана функцияларды кеңейтүү үчүн субкласстарга альтернатива болуп саналат. Келгиле, бул аныктаманы мисал аркылуу кененирээк кароого аракет кылалы. Сиз дагы бир заманбап динди түздүңүз жана адамдарга тиешелүү кызматтарды көрсөтүүнү пландаштырдыңыз дейли. Анткени заманбап тенденциялар вегетарианизмди, экологияны, адамдык өнүгүүнү көздөйт жана эмнегедир адамдарды “салттуу” диндер канааттандырbyte (же акыры атеизм), анда сиз негизги агымга ээрчип, башка Жаңы доордун динин (азыркы диндердин синтезинин бир түрү) түзөсүз. диндер, ар биринен каалаганын алып). Башында төмөнкү кызматтарды көрсөтөсүз: 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);
    }
    // Здесь своя стоимость и другие методы
}
Бирок кемчorктер дароо эле көрүнүп турат, бүткүл дүйнөнүн руханиятын өнүктүрөт, бизде жаңы кошумча варианттар пайда болушу мүмкүн, бул жаңы класстарды билдирет, эгерде биз дагы эле азыркыларды бириктиришибиз керек болсо, анда класстар тездик менен өсөт, жок дегенде бизде мындан ары жок. өзүнчө эмес, чогуу эки варианты бар Fortune классынын жетиштүү:
public class DivinationWithChakrasAndAura implements Service {
    // Здесь своя стоимость и другие методы
}
Бул жерде сиз Javaдагы "сактоочу" Decorator үлгүсүн колдоно аласыз. Бул үчүн биз кошумча опциялар үчүн класс түзөбүз, ал дагы Кызматты ишке ашырат, бирок ошондой эле Кызматты камтыйт. Ошого жараша, биз төлгөгө заказ беришибиз керек болгондо, ал тургай, эки вариант бирге болсо, ал мындай болот: Интерфейс башынан эле кандай болсо, ошондой.
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 кошумча варианттын суммасынын натыйжасын берет. Бул ар бир кошумча кереги жок дегенди билдирет жаңы классты түзүү үчүн опция (же экөөнүн айкалышы). Кошумчалай кетсек, бул опцияларды Fortune айтуу кызматына гана эмес, Гороскоп кызматына да колдонсо болот. Ошондуктан, жакынкы келечекте биз төмөнкү кошумча варианттарды ишке ашырышыбыз керек болгондо: - социалдык тармактардагы аватар өнөктөштөрдүн шайкештиги - аралыктан канализация аркылуу акча агымын жакшыртуу, бизге 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