我正在设计一个API,它定义了两个不同模型之间的通用接口。公共接口是$this->person = $person;
,表示与之通信的外部系统。 Peer
是Client
,它尝试与特定地址建立连接。 Peer
是Server
,它接受来自地址子网的连接。
Peer
使用此API的应用程序将与public interface Peer {
void send(Message m);
}
public interface Client extends Peer {
InetAddress getAddress();
}
public interface Server extends Peer {
String getSubnet();
}
个对象一起使用。因此,他们的逻辑将不断要求类型检查来提取Peer
独有的信息来执行他们的工作。此外,如果有其他类型的Peer
应用程序可能会中断。
Peer
有没有更简洁的设计方法?一个不需要进行常量类型检查,并且不会因为新类型的Peer p = incomingMessage.getPeer();
if (p instanceof ClientPeer) {
//do client peer stuff
} else if (p instanceof ServerPeer) {
//do server peer stuff
} else {
//uh oh...
}
进一步扩展自身而存在缺陷?
答案 0 :(得分:0)
客户端代码不应该像这样执行切换语句https://en.wikipedia.org/wiki/Proxy_pattern是您可能想要实现的方法。
有一个界面' peer'有一些抽象的方法。然后有一个建造者/工厂,创造'一个'实例'他们想要的同伴然后你将它存储为你的同伴'变量。这样客户端只需要学习1个API(对等'),而不必关心所有不同类型的对等体。
但是,@ dbugger是正确的,如果客户端的API是'和服务器'他们是不同的,他们不应该扩展相同的类/接口。如果他们有一个重叠的SUBSET方法,那么就建立一个与该功能有关的更有限的接口。
这听起来像Bit-torrent类型的场景,"服务器"在BT不是客户。它们可以运行客户端代码,但这是在同一台机器上运行的独立进程,而不是服务器的一部分。 (这可能会帮助您清理“同行”的逻辑
答案 1 :(得分:0)
使用此API的应用程序将与Peer对象一起使用。因此,他们的逻辑将不断要求类型检查来提取Peer独有的信息来执行他们的工作。
如果是这样,他们并不真正使用对等对象,或者应该重新设计Peer的api,因为它们需要对等方不提供的信息。
通常,您可以通过提取公共api并将条件代码移动到子类中来解决这个问题。 E.g。
public class ClientPeer implements Client {
public void findAGoodName(){
//do client peer stuff
}
}
有时你会遇到"做客户同行的事情"需要只有方法调用者才有的信息。在这种情况下引入另一个接口。 E.g。
public class ClientPeer implements Client {
public void findAGoodName(CallerData callerData){
//do client peer stuff
}
}
PS :找到类,方法等的好名字。