Это объяснение Эриха Гаммы (GoF) кажется лучшим ... http://www.mif.vu.lt/~plukas/resources/Extension%20Objects/ExtensionObjectsPattern%20Gamma96.pdf
По сути, заявив, что
a) Объединение всех операций и состояния, необходимого для разных клиентов (настоящих и будущих) в единый интерфейс, приводит к раздутому интерфейсу
b) Желаемые операции (известные и неизвестные) можно разделить на компоненты. Из которого можно определить один (или более) компонентный интерфейс (расширенные интерфейсы). Они могут или не могут быть реализованы объектами (текущими и будущими).
c) Клиенты, которые хотят использовать этот расширенный интерфейс, могут запросить, поддерживает ли его компонент
d) Наконец, этот расширенный интерфейс имеет общий базовый класс (ComponentExtension) с минимальным интерфейсом для управления самим расширением (проверка, существует ли расширение, информирование расширения о том, что оно собирается удалить)
Используется, когда:
1 Когда ваши существующие классы могут потребовать дополнительных и непредвиденных интерфейсов (то есть новых, в настоящее время неизвестных моделей поведения).
2 Когда класс, представляющий абстракцию ключа, играет разные (непредвиденные и открытые) роли для разных клиентов.
3 Вы хотите расширить без подклассов
Это похоже на следующие шаблоны
Посетитель , которому требуется стабильная иерархия классов и вводит цикл зависимостей
Декоратор , где использование более прозрачно, интерфейс узок и существующие операции должны быть расширены
Адаптер , который поддерживает СУЩЕСТВУЮЩИЕ интерфейсы