我遇到以下情况,客户端类根据它收到的消息类型执行不同的行为。我想知道是否有更好的方法来做到这一点,因为我不喜欢 instanceof 和 if 语句。
我想做的一件事是将方法从客户端类中取出并将它们放入消息中。我会将类似 process() 的方法放入 IMessage 接口中,然后将消息特定行为放入每个具体消息类型中。这将使客户端变得简单,因为它只调用 message.process() 而不是检查类型。然而,唯一的问题是条件语句中包含的行为与 Client 类中包含的数据操作有关。因此,如果我确实在具体消息类中实现了一个处理方法,我就必须将它传递给客户端,而且我也不知道这是否真的有意义。
public class Client {
messageReceived(IMessage message) {
if(message instanceof concreteMessageA) {
concreteMessageA msg = (concreteMessageA)message;
//do concreteMessageA operations
}
}
if (message instanceof concreteMessageB) {
concreteMessageb msg = (concreteMessageB)message;
//do concreteMessageB operations
}
}
避免instanceof测试的简单方法是多态分派;例如
public class Client {
void messageReceived(IMessage message) {
message.doOperations(this);
}
}
其中每个消息类定义了适当的doOperations(Client client)
method.
编辑:第二个解决方案更符合要求。
用 switch 语句替换一系列“instanceof”测试的替代方法是:
public class Client {
void messageReceived(IMessage message) {
switch (message.getMessageType()) {
case TYPE_A:
// process type A
break;
case TYPE_B:
...
}
}
}
每个 IMessage 类都需要定义一个int getMessageType()
方法返回适当的代码。在我看来,枚举与整数一样工作,而且更优雅。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)