Шаблон декоратора может динамически добавлять возможности к существующим объектам. Ниже я буду использовать простой пример, чтобы продемонстрировать, как использовать шаблон декоратора в программе.
1. Шаблон-декоратор
Давайте на минутку предположим, что вы ищете девушку. Есть много девушек из разных стран, таких как США, Китай, Япония, Франция и т. д. У каждой из них разные характеры и интересы. Если вам нужно смоделировать такую ситуацию в программе, предположим, что каждая девушка — За. В классе Java будут тысячи классов, что приведет к расширению классов, а масштабируемость такого дизайна будет относительно плохой. Потому что если нам нужна новая девушка, нам нужно создать новый Java-класс, что фактически нарушает принцип OCP (открыт для расширения, закрыт для модификации), которому необходимо следовать при разработке программ.
Давайте создадим еще один дизайн, в котором каждая личность или хобби станет украшением, которое можно будет динамически добавлять к телу каждой девушки.
2. Структура диаграммы классов
3. Пример кода шаблона декоратора
Девушка.java
Скопируйте код кода следующим образом:
публичный абстрактный класс Girl {
Строковое описание = "ничего особенного";
публичная строка getDescription(){
описание возврата;
}
}
AmericanGirl.java
Скопируйте код кода следующим образом:
публичный класс AmericanGirl расширяет Girl {
publicAmericanGirl() {
описание = "+Американец";
}
}
EuropeanGirl.java
Скопируйте код кода следующим образом:
публичный класс EuropeanGirl расширяет Girl {
общественная европейская девушка () {
описание = "+Европейский";
}
}
GirlDecorator.java
Скопируйте код кода следующим образом:
публичный абстрактный класс GirlDecorator расширяет Girl {
публичная абстрактная строка getDescription();
}
Наука.java
Скопируйте код кода следующим образом:
публичный класс Science расширяет GirlDecorator {
частная девушка девушка;
общественная наука(Девочка){
this.girl = девушка;
}
@Override
публичная строка getDescription() {
return this.girl.getDescription() + "+Like Science";
}
общественный недействительный CaltulateStuff () {
System.out.println("научный расчет!");
}
}
Арт.java
Скопируйте код кода следующим образом:
публичный класс Art расширяет GirlDecorator {
частная девушка девушка;
паблик Арт(Девочка){
this.girl = девушка;
}
@Override
публичная строка getDescription() {
return this.girl.getDescription() + "+Like Art";
}
общественная недействительная ничья () {
System.out.println("рисовать картинки!");
}
}
Main.java
Скопируйте код кода следующим образом:
общественный класс Main {
public static void main(String[] args) {
//Обычная американская девушка
Девушка g1 = новая AmericanGirl();
System.out.println(g1.getDescription());
//Те, кто любит науку
Наука g2 = новая наука(g1);
System.out.println(g2.getDescription());
//Тем, кто любит искусство
Арт g3 = новый Арт(g2);
System.out.println(g3.getDescription());
}
}
4. Применение шаблона декоратора в JDK
IO в Java — наиболее типичный пример использования шаблона декоратора.
Ниже приведен простой пример оформления объекта InputStreamReader с помощью объекта BufferedReader:
Скопируйте код кода следующим образом:
Вход BufferedReader = новый BufferedReader (новый InputStreamReader (System.in));
//System.in — это объект InputStream.
(Полный текст заканчивается)