Я не могу выбрать, какой шаблон подходит лучше всего для следующей проблемы.
У меня есть клиентская система, кто будет взаимодействовать с отдельной подсистемой. Подсистема является вполне сложной и таким образом, мне нужен интерфейс между двумя для упрощения клиентской системы. Это походит на идеальное пригодное для шаблона Фасада, но я думаю, что Шаблон "адаптер" также соответствует моей проблеме.
Это имеет какое-либо значение, если интерфейс в середине называет отдельные задачи на подсистеме через простые вызовы API?
Судя по вашему описанию, оно больше соответствует принятому определению Фасада, но я бы сказал, что это скорее семантические дебаты, чем что-либо еще. Фасад в целом более упрощает взаимодействие со всей подсистемой, тогда как адаптер больше ориентирован на настройку существующего интерфейса или вызов в соответствии с вашими конкретными потребностями (например, базовая функциональность есть, но возвращаемые типы не совсем то, что вы хотите, так далее).
Это явно похоже на образец фасада, ваша цель - упрощение, а не фактическая адаптация.
Определение фасада:
Обеспечение единого интерфейса для набора интерфейсов в подсистеме. Фасад определяет интерфейс более высокого уровня, который упрощает использование подсистемы.
Определение адаптера:
Преобразование интерфейса класса в клиенты ожидают другого интерфейса. Адаптер позволяет классам работать вместе это не могло быть иначе из-за несовместимые интерфейсы.
Определения взяты из: http://dofactory.com/Patterns/Patterns.aspx
Шаблон адаптера используется, когда вы хотите адаптировать интерфейс существующего класса к другому интерфейсу, с которым клиент ожидает работать. Обычно это просто включает делегирование или перевод из метода одного интерфейса в соответствующий метод другого.
Фасад используется, когда вы хотите упростить сложную систему, предоставив более простой набор API-интерфейсов, с которыми может работать клиент. Он включает в себя перевод сложного шаблона вызовов API в один вызов API.
Ваш случай больше похож на фасад, чем на адаптер. Реализация только шаблона адаптера не даст вам преимущества упрощения API. В конце концов, не имеет значения, как вы это называете. И эти закономерности не исключительны. Вы можете смешать и то, и другое таким образом, чтобы получить максимальную пользу.
Разница между фасадом и адаптером в основном заключается в намерение.
Если вы хотите упростить интерфейс, то вам нужен фасад. Если вы хотите адаптировать интерфейс, чтобы его можно было использовать как что-то еще, то это адаптер.
Но на самом деле, в чем проблема, как вы это называете? Мое практическое правило: если вы реализуете существующий интерфейс, вы, вероятно, используете интерфейс адаптера. Если вы создаете новый упрощенный интерфейс, это Фасад.