适用于不同型号的可扩展接口

时间:2016-01-04 21:36:03

标签: api design-patterns

我正在设计一个API,它定义了两个不同模型之间的通用接口。公共接口是$this->person = $person;,表示与之通信的外部系统。 PeerClient,它尝试与特定地址建立连接。 PeerServer,它接受​​来自地址子网的连接。

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... } 进一步扩展自身而存在缺陷?

2 个答案:

答案 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 :找到类,方法等的好名字。