Да - он очень близок к шаблону запрос-ответ и довольно распространен в приложениях SOA или в сценариях, где вы предоставляете открытый интерфейс для внешних абонентов.
Основным преимуществом этого шаблона является то, что он очень устойчив к версии.
Обычно, если я хочу добавить новый аргумент в существующий метод интерфейса, это нарушает совместимость этого интерфейса - поскольку сигнатура метода изменилась. Клиенты, скомпилированные для одной версии, не могут вызывать другую - даже если новое поле является необязательным или старое поле устарело и может быть проигнорировано.
При использовании этого приложения сигнатура метода (ProcessRequest
в вашем примере) остается прежней, но тип запроса (ConcreteRequest
в вашем примере) теперь имеет дополнительное свойство. Вообще говоря, большинство сериализаций / десериализаций допускают это (или могут быть настроены так, чтобы терпеть это); если свойство появляется в данных, но не в типе, к которому оно десериализуется, оно будет проигнорировано. Conversley, если свойство не отображается в данных, но отображается в экземпляре, тогда экземпляр будет иметь значение по умолчанию (ноль, ноль или любое другое).
Таким образом, я могу добавлять / удалять параметры из метода так, как я бы не смог, если бы у меня был обычный метод со списком аргументов. По мере расширения и развития публичного интерфейса это может стать очень мощным инструментом.
Сказав все это - полезно , только если вам это нужно . Я видел его в сценариях, где это тоже не приносит никакой пользы.