Пример на Java
import java.util.List; import java.util.ArrayList;
/** "Component" */ interface Graphic {
//Prints the graphic. public void print();
}
/** "Composite" */ class CompositeGraphic implements Graphic {
//Collection of child graphics. private List<Graphic> mChildGraphics = new ArrayList<Graphic>();
//Prints the graphic. public void print() { for (Graphic graphic: mChildGraphics) { graphic.print(); } }
//Adds the graphic to the composition. public void add(Graphic graphic) { mChildGraphics.add(graphic); }
//Removes the graphic from the composition. public void remove(Graphic graphic) { mChildGraphics.remove(graphic); }
}
/** "Leaf" */ class Ellipse implements Graphic {
//Prints the graphic. public void print() { System.out.println("Ellipse"); }
}
/** Client */ public class Program {
public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse();
//Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic();
//Composes the graphics graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3);
graphic2.add(ellipse4);
graphic.add(graphic1); graphic.add(graphic2);
//Prints the complete graphic (four times the string "Ellipse"). graphic.print(); } } Декоратор (шаблон проектирования) Декоратор, Decorator — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту. Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности. Известен также под менее распространённым названием Обёртка (Wrapper), которое во многом раскрывает суть реализации шаблона. Основные характеристики Задача Объект, который предполагается использовать, выполняет основные функции. Однако может потребоваться добавить к нему некоторую дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта. Способ решения Декоратор предусматривает расширение функциональности объекта без определения подклассов. Участники Класс ConcreteComponent — класс, в который с помощью шаблона Декоратор добавляется новая функциональность. В некоторых случаях базовая функциональность предоставляется классами, производными от класса ConcreteComponent. В подобных случаях класс ConcreteComponent является уже не конкретным, а абстрактным. Абстрактный класс Component определяет интерфейс для использования всех этих классов. Следствия 1. Добавляемая функциональность реализуется в небольших объектах. Преимущество состоит в возможности динамически добавлять эту функциональность до или после основной функциональности объекта ConcreteComponent. Реализация Создается абстрактный класс, представляющий как исходный класс, так и новые, добавляемые в класс функции. В классах-декораторах новые функции вызываются в требуемой последовательности — до или после вызова последующего объекта. При желании остаётся возможность использовать исходный класс (без расширения функциональности), если на его объект сохранилась ссылка. Замечания и комментарии
|