非常好的讨论。几个小时来我一直在谈这个哲学问题,并且我找到了满足我痴迷的解决方案。 (我喜欢这个东西的原因是它结合了具体和抽象的逻辑 - 布尔+设计。)
我简要地考虑过使用异常来返回结果。我放弃了这个想法,因为在许多情况下,它会消除脱钩,这是模式本身的核心,正如一些人已经注意到的那样。另外,结果通常不是一个异常,而是一个标准的返回值。我可能会溃疡。最终,我写了一个客户端,用它自己实例化一个接收者,将接收者的所有逻辑保留在它所属的地方。客户端只是调用该命令的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参数这一事实是无关紧要的。它也可以是任何对象。
我知道这是一个古老的线程,但希望你们中的一些人再次参加。如果您发现缺陷,请随时打破我的心。这就是我们所做的。
如果托马斯先不回答,我的答案会非常相似。好答案。一个模式是一个指导,而不是一个硬性和快速的规则。 – Odd 2009-07-28 13:44:34