Назначение: отделить абстракцию от ее реализации так, чтобы то и другое можно было изменять независимо.

Общая структура решения.

 

 

Abstraction – абстракция: определяет интерфейс абстракции; хранит ссылку на объект типа Implementor.

RefinedAbstraction – уточненная абстракция: расширяет интерфейс, определенный абстракцией Abstraction.

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

ConcreteImplementor – конкретные реализаторы: содержат конкретные реализации интерфейса класса Implementor.

Объект Abstraction перенаправляет запросы клиента своему объекту Implementor.