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