Я полагаю, что вы, возможно, путаете внешний API (фасад), который использует клиент, и код, который фактически вызывается через делегат:
public class Worker implements IWorker {
private IProcessor delegate;
void doWork(PublicDO data) {
PrivateDO pdo = convert(data);
delegate.doProcess(pdo);
}
...
}
Делегат без необходимости имеет тот же интерфейс, что и фасад. Кроме того, интерфейс делегата может быть изменен, в то время как открытый интерфейс остается неизменным. Может быть несколько реализаций делегатов, которые немного различаются, создаются во время выполнения на основе некоторых параметров.
Таким образом, всегда полезно разделять открытый интерфейс и интерфейс делегирования.
Делегат, имеющий тот же интерфейс, что и общедоступный фасад, - просто простейший случай.