Очень хорошая дискуссия. Я был на этом философском вопросе в течение нескольких часов, и я нашел решение, которое удовлетворяет мою одержимость. (Причина, по которой я люблю этот материал, состоит в том, что он сочетает в себе конкретную и абстрактную логику - логические + конструкции.)
Я кратко рассмотрел возможность использования Исключений для возврата результатов. Я отказался от этой идеи, потому что во многих случаях это устраняло бы разъединение, сердце самого паттерна, как некоторые из вас отмечали. Кроме того, результатом часто является не исключение, а стандартное возвращаемое значение. Вероятно, у меня будут язвы.
В конце концов, я написал клиента, который создает экземпляр получателя с собой, сохраняя всю логику в получателе, где он принадлежит. Клиент просто вызывает команду execute () и продолжает. Получатель может затем вызывать публичные методы на клиенте. Там нет ничего, чтобы вернуться.
Вот пример кода. Я не писал командный класс, потому что думаю, что вы получите идею без него. Его метод execute () вызывает метод run () получателя.
Клиент:
Class ClientType{
CommandType m_Command;
ReceiverType m_Receiver;
boolean m_bResult;
ClientType(){
m_Receiver = new ReceiverType(this);
m_Command = new CommandType(m_Receiver);
}
public void run(){
...
m_Command.execute();
}
/* Decoupled from both the
* command and the receiver.
* It's just a public function that
* can be called from anywhere. /
public setResult(boolean bResult){
m_bResult = bResult;
}
}
Получатель:
Class ReceiverType{
ClientType m_Client;
boolean m_bResult;
ReceiverType(ClientType client){
m_Client = client;
}
public void run(){
...
m_Client.setResult(m_bResult);
}
}
На первый взгляд может показаться, что я нарушил требование развязки. Но учтите, что клиент ничего не знает о реализации получателя. Тот факт, что получатель знает, как вызывать публичные методы для клиента, является стандартным тарифом Получатели всегда знают, что делать со своими объектами параметров. Там нет никаких зависимостей. Тот факт, что конструктор получателя принимает параметр ClientType, не имеет значения. Это может быть любой объект.
Я знаю, что это старая тема, но надеюсь, что некоторые из вас снова включатся. Не стесняйтесь разбить мое сердце, если вы видите недостаток. Это то, что мы делаем.