printСтруктурирующие паттерны

printАдаптер

Adapter

Назначение
Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты. Адаптер обеспечивает совместную работу классов с несовместимыми интерфейсами, которая без него была бы невозможна.

Результаты
1. Используя различные сменные адаптеры можно использовать один и тот же класс в разных системах, независимо от требуемого интерфейсом.
2. Адаптер объектов уже не обладает интерфейсом Adaptee, так что его нельзя использовать там, где Adaptee был применим. В тех случаях, когда клиенты должны видеть объект по-разному, применяются двусторонние адаптеры.

Адаптер класса:
1. Можно легко заместить некоторые виртуальные методы адаптируемого класса Adaptee, так как Adapter есть не что иное, как подкласс Adaptee.
2. Адаптер класса вводит только один новый объект. Чтобы добраться до адаптируемого класса, не нужно никакого дополнительного обращения по указателю.
3. Паттерн не применим, если требуется адаптирование и класса Adaptee и его подклассов.

Адаптер объектов:
1. Позволяет адаптеру работать и с самим классом Adaptee и его подклассами.
2. Для замещения виртуальных методов класса Adaptее требуется породить от Adaptee подкласс и инициализировать указатель адресом объекта этого подкласса.

Структура
14677.png

Реализация
// Адаптируемый класс
class Adaptee {
public:
  void Operation();
};
// Требуемый интерфейс
class Target {
public:
  virtual void Request()=0;
};
// Адаптер класса
class Adapter1: public Target, private Adaptee {
public:
  void Request() { Operation(); }
};
// Адаптер объектов
class Adapter2: public Target {
  Adaptee *a;
public:
  void Request() { a->Operation(); }
};
loading