Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Декоратор — структурный шаблон проектирования, предназначенный для динамического подключения дополнительного поведения к объекту.
Шаблон Декоратор предоставляет гибкую альтернативу практике создания подклассов с целью расширения функциональности. Задача: объект, который предполагается использовать, выполняет основные функции. Однако может потребоваться добавить к нему некоторую дополнительную функциональность, которая будет выполняться до, после или даже вместо основной функциональности объекта. Решение: шаблон “декоратор” предусматривает расширение функциональности объекта без определения подклассов.
Класс ConcreteComponent — класс, в который с помощью шаблона Декоратор добавляется новая функциональность. В некоторых случаях базовая функциональность предоставляется классами, производными от класса ConcreteComponent. В подобных случаях класс ConcreteComponent является уже не конкретным, а абстрактным. Абстрактный класс Component определяет интерфейс для использования всех этих классов. Пример реализации шаблона:
# include < iostream > #include <memory>
class IComponent { public: virtual void operation() = 0; virtual ~IComponent(){} };
class Component: public IComponent { public: virtual void operation() { std::cout<<"World!"<<std::endl; } };
class DecoratorOne: public IComponent { std::shared_ptr<IComponent> m_component;
public: DecoratorOne(IComponent* component): m_component(component) {}
virtual void operation() { std::cout << ", "; m_component->operation(); } };
class DecoratorTwo: public IComponent { std::shared_ptr<IComponent> m_component;
public: DecoratorTwo(IComponent* component): m_component(component) {}
virtual void operation() { std::cout << "Hello"; m_component->operation(); } };
int main() { DecoratorTwo obj(new DecoratorOne(new Component())); obj.operation(); // prints "Hello, World!\n"
return 0; } Порождающие шаблоны Абстрактная фабрика (Abstract Factory) Абстрактная фабрика — порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемые объекты, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется созданием абстрактного класса Factory, который представляет собой интерфейс для создания компонентов системы (например, для оконного интерфейса он может создавать окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.
Этот шаблон предоставляет интерфейс для создания семейств взаимосвязанных или взаимозависимых объектов, не специфицируя их конкретных классов. Как и в реальной жизни фабрика имеет некую специализацию, создавая товары или устройства какого-либо определенного типа. Фабрика, которая выпускает, например, мебель, не может производить, например, еще и компоненты для смартфонов. В программировании фабрика объектов может создавать только объекты определенного типа, которые используют единый интерфейс. Самыми главными преимуществами данного паттерна в С++, является упрощение создания объектов различных классов, использующих единый интерфейс. Паттерн предоставляет интерфейс для создания семейств, связанных между собой, или независимых объектов, конкретные классы которых неизвестны. От класса «абстрактная фабрика» наследуются классы конкретных фабрик, которые содержат методы создания конкретных объектов-продуктов, являющихся наследниками класса «абстрактный продукт», объявляющего интерфейс для их создания. Клиент пользуется только интерфейсами, заданными в классах «абстрактная фабрика» и «абстрактный продукт».
Реализация на C++ //общий интерфейс для данных любого формата class FormattedData { //... }; // конкретный формат class FormattedData1: public FormattedData { //... }; // другой конкретный формат class FormattedData2: public FormattedData { //... }; // абстрактная фабрика class AbstractFactory { public: virtual FormattedData * createFormattedData () = 0; }; //фабрика для создания объектов, содержащих данные // нужного формата class FormatFactory: public AbstractFactory { public: FormattedData* createFormattedData() { if(/* some condition */) { return new FormattedData1(); } else { return new FormattedData2(); } } }; //использование абстрактной фабрики int main () { FormatFactory* pfactory = new FormatFactory(); FormattedData* pdata = pfactory->createFormattedData(); //send data //... if(pfactory)delete pfactory; if(pdata)delete pdata; return 0;} Еще пример
Вывод программы будет следующим:
Для данного паттерна так же подходит другое название — виртуальный конструктор. Создание конкретной фабрики
И так, нам нужен класс, который сможет создавать объекты, поддерживающие единый интерфейс. Назовем этот интерфейс Foo, а фабрику соответственно FooFactory. В качестве идентификатора для создания объекта возьмем строку. С lass FooFactory { public: FooFactory(); ~virtual FooFactory(); Foo * create(const std::string & id) const; }; А как же мы будем добавлять классы и собственно создавать их экземпляры? В С++ есть шаблоны, которые и помогут решить эту не простую задачу. Для создания объектов типа Foo мы будем использовать другие объекты, вспомогательные, которые возьмут на себя работу по созданию объектов нужного нам класса. В простонародье такие классы называют creator. Создается абстрактный класс creator, у которого обычно есть только один метод — создание объекта определенного интерфейса, в текущем варианте объекты типа Foo. А на его основе уже создаются конкретные классы creator'ы. Благодаря абстрактному классу creator, мы можем хранить набор конкретных creator'ов в любом контейнере.
В данном случае шаблоны позволяют генерировать код для конкретного creator'а на основе параметра шаблона. Абстракный класс для создания объектов типа Foo:
Class abstractFooCreator { public: virtual fooCreator() {} virtual Foo * create() const = 0; }; И шаблонный класс, в котором будет генерироваться собственно код для создания объекта конкретного класса:
template <class C>
|
||||||||||
Последнее изменение этой страницы: 2021-11-27; просмотров: 70; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.244.216 (0.019 с.) |