java 接口的不同实现具有不同的属性

plicqrtu  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(133)

我有接口Service
public interface Service{}
以及多种实现
public class ServiceA implements Service{}
public class ServiceB implements Service{}
现在,每个服务都有某种配置,例如

public interface Service{   
   ServiceConfiguration getConfig()
}

但是,这些实现中的每一个都需要不同的配置,例如ServiceA需要portversionurl,serviceB需要portsocketfile等等。
有什么优雅的好的实践方法可以实现这一点?我唯一想到的是为每个服务创建ServiceConfiguration的实现(并将其用作Marker接口),然后将其强制转换,例如
public interface ServiceConfiguration {}

public class ServiceAConfiguration implements ServiceConfiguration {
    int port;
    int version;
    String url;
}

public class ServiceBConfiguration implements ServiceConfiguration {
    int port;
    Socket socket;
    File file;
}

然后将其转换为如下代码:

Service s = new ServiceA(...);
ServiceAConfiguration config = (ServiceAConfiguration)s.getConfig();

有没有更好的方法,某种最佳实践或某种设计模式?到目前为止,我只找到了AbstractDocument设计模式来处理属性,但我认为这在这里不适用。
谢谢你帮忙!

34gzjxbg

34gzjxbg1#

可以在Service定义中使用泛型:

public interface Service<T extends ServiceConfiguration>{   
   T getConfig()
}

public class ServiceA implements Service<ServiceAConfiguration>{}
public class ServiceB implements Service<ServiceBConfiguration>{}
x一个一个一个一个x一个一个二个x
您不再需要强制转换配置:

Service s = new ServiceA(...);
ServiceAConfiguration config = s.getConfig();
bcs8qyzn

bcs8qyzn2#

在我看来,您使用Configuration作为数据载体,因此需要公开实际状态(端口、url等),我建议您改变方法,提供任何必须配置的内容,或者创建新的配置对象(任何更适合您的用例的内容)。
属性使它看起来像连接的配置,所以我将它用作占位符。

public interface ServiceConfiguration {

   Connection configureConnection();
}
public class ServiceAConfiguration implements ServiceConfiguration {
    //properties
    
    @Override
    Connection configureConnection() {
        return a connection using port, version and url;
    }
}
public class ServiceBConfiguration implements ServiceConfiguration {
    //properties

    @Override
    Connection configureConnection() {
        return a connection using port, socket and file;
    }
}

这样,您就不需要向外界公开实际的配置细节,因此也不需要将ServiceConfiguration强制转换为实际的类。

相关问题