Шаблон проектирования — шаблон декоратора

Шаблоны проектирования

предисловие

Шаблоны проектирования повсюду в нашем коде, например, в первой оконной программе, которую мы будем делать, когда только начинаем работать с JAVA.SwingсерединаActionsListenerКласс реализован с помощью шаблона наблюдателя, и у нас больше возможностей для работы с файлами.java.ioМногие классы в пакете разработаны с использованием шаблона декоратора. Если вы изучали углубленноSpringУ людей с исходным кодом будет такое чувство:Spring就是一些设计模式狂魔的作品.

Шаблоны проектирования имеют очень важный объектно-ориентированный принцип:针对接口编程,不针对实现编程. Мы увидим это более или менее, когда будем отлаживать и устранять неполадки или писать программы.Spring MVCЧасть исходного кода в , большинство людей найдутSpringКод сложнее читать. Это потому, что мы в основном думаем о коде с программным мышлением, ориентированным на реализацию. Таким образом, конечно, довольно сложно понять, что сделала группа сумасшедших дизайнерских шаблонов. нам нужно понятьSpringХорошей основой для исходного кода или другого открытого исходного кода является знание общих шаблонов проектирования.

шаблон декоратора

Что такое шаблон декоратора? Давайте посмотрим на интерпретацию Ду Ньянга.

Динамически прикрепляйте обязанности к объектам. Для расширения функциональности декораторы предоставляют альтернативу наследованию.

Начнем с того, что нам знакомоjava.ioНачните с класса, реализованного шаблоном декоратора в пакете. Давайте посмотрим на знакомую коллекцию объектов

BufferedInputStreamа такжеLinerNumberInputStreamпростираются отFilterInputStream,а такжеFilterInputStreamявляется абстрактным декоративным классом.

украшать классы java.io

Наш анализ классов java.io, приведенный выше, подтверждает важность использования декораторов: для динамического назначения обязанностей объектам.

Зачем использовать шаблон декоратора

Начнем с проектирования простого магазина напитков.В магазине напитков есть оригинальный чай с молоком, жемчужный чай с молоком, зеленый чай, маття и т. д., приправы включают сахар, молоко, молочную пену и т. д. Мы впервые проведем анализ диаграммы классов в нашем мозгу.

Этот тип дизайна похож на жестко закодированную форму и не может быть хорошо расширен на более позднем этапе, а также нарушает очень важный принцип объектно-ориентированного проектирования:类应该对扩展开放,对修改关闭.

Мы видим, что этот тип магазина напитков, спроектированный по наследству, имеет большой недостаток: изменение цены на приправу заставит нас изменить существующий код; как только будет разработана новая приправа или новый напиток, существующий код изменится. . Ремонтопригодность такого кода очень плохая.

Затем мы используем шаблон декоратора для редизайна.

Когда наши компоненты объединяются с шаблоном декоратора, добавляются новые поведения. Например, красная фасоль + жемчуг = чай с молоком из красной фасоли и жемчуга, выходит новый чайный напиток, нет необходимости добавлять новый класс.

Код

Абстрактный класс напитков

public abstract class Berverage {//饮料店抽象基类
    public String description;
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public abstract int Cost();
}

Абстрактный класс приправ

public abstract class CondimentDecorator  extends  Berverage{
    public abstract String getDescription();
}

Напитки

public class GreenTea extends Berverage {

    public GreenTea () {
        description = "this is a cup of green tea ";
    }

    public int Cost() {
        return 5;
    }
}
public class MilkTea extends  Berverage {
    public MilkTea() {
        description = "this is a cup of milk tea";
    }
    public int Cost() {
        return 6;
    }
}

public class PearlsMilkTea extends Berverage {
    public PearlsMilkTea() {
        description = "this is a cup of pearls milk tea  ";
    }
    public int Cost() {
        return 2;
    }
}

Приправа

public class Milk extends CondimentDecorator {//牛奶
    Berverage berverage;
    public Milk( Berverage berverage) {
        this.berverage = berverage;
    }

    public String getDescription() {
        return berverage.getDescription()+"+milk";
    }

    public int Cost() {
        return berverage.Cost()+3;
    }
}

тестовый код

public class Application {

    public static void main(String[] args) {

        //珍珠奶茶
        Berverage berverage1 = new PearlsMilkTea();
        System.out.println(berverage1.getDescription() + " cost = " + berverage1.Cost());

        //绿茶加牛奶
        Berverage berverage = new GreenTea();
        berverage = new Milk(berverage);
        System.out.println(berverage.getDescription()+"cost = "+berverage.Cost());
    }
}

Результаты теста

точка

Шаблон декоратора: динамическое назначение обязанностей объектам. Для расширения функциональности декораторы предоставляют альтернативу наследованию.

Пространство охватило два важных принципа объектно-ориентированного проектирования.

  • Программирование для интерфейса, а не для реализации
  • Классы должны быть открыты для расширения и закрыты для модификации

The last

Три ряда, должно быть, мой учитель. В то же время, чтобы поделиться с галантерейными товарами, Caishuxueqian также надеюсь, что меч будет трактоваться. Также приветствую внимание самородков или просто книги под названием柴码