非常好的讨论。我已经研究这个哲学问题好几个小时了,我找到了一个满足我痴迷的解决方案。(我喜欢这个东西的原因是它结合了具体和抽象的逻辑——布尔+设计。)
我简要地考虑过使用异常来返回结果。我放弃了这个想法,因为在许多情况下,它会消除解耦,这是模式本身的核心,正如你们中的一些人所指出的那样。此外,结果通常不是异常,而是标准返回值。我可能会得溃疡。
最终,我编写了一个客户端,它自己实例化一个接收器,将所有逻辑保留在它所属的接收器中。客户端只需调用命令的 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 参数这一事实是无关紧要的。它也可以是任何对象。
我知道这是一个老话题,但希望你们中的一些人能再次加入。如果你看到一个缺陷,请随时让我心碎。这就是我们所做的。