接口隔离原则 - Java的

问题描述:

我有一个接口接口隔离原则 - Java的

interface XXXCommandHandler(){ 
    void parse(String something); 
    String response(); 
    String additionalResponse(); 
} 
  1. 一些实现XXXCommandHandler的类不实现additionalResponse()。
  2. 我使用ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)得到实现XXXCommandHandler
  3. 类然后调用分析,应对和additionalResponse
  4. 由于某些不实现additionalResponse我不得不返回null 。

我能想到的以下

  1. ,而不是返回空的类没有实现additionalResponse,declaire additionalResponse作为默认的方法和返回null /或使其返回可选等,并覆盖它的在实现additionalResponse方法的类上。
  2. 丑陋的方式: - 在所有类别中返回NULL没有实现additionalResponse
  3. 与解析和应对方法和XXXCommandHandlerAddtionalresponse()与additionalResponse方法延长XXXCommandHandlerParser即

    接口XXXCommandHandlerParser创建两个不同的接口XXXCommandHandlerParser() (){

    void parse(String something); 
        String response(); 
    
    } 
    

    接口XXXCommandHandlerAddtionalresponse() 延伸XXXCommandHandlerParser {

    String additionalResponse(); 
    } 
    
  4. 但如果我这样做#3,我不得不改变 ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandlerAddtionalresponse.class)。

  5. 如果我做#4,那么没有实现additionalResponse或没有实现XXXCommandHandlerAddtionalresponse的类将不会被拾取。

你能想到任何优雅的方式吗?

+0

@Mena - 我觉得你的意思是#1在接口默认方法中可选。 –

+0

“我有一个接口'接口XXXCommandHandler(){...'” ......这不是有效的Java。 –

+0

Hari,您仍然需要正确格式化代码以获得更好的可读性 –

它的味道哪种解决方案更优雅的事,但有(至少)一个更路要走:

  1. 创建一个顶层接口:了InterfaceA

  2. 扩展了InterfaceA到interfaceB与额外的方法。

  3. 收藏型了InterfaceA

  4. 的豆如果实例interfaceB高于铸态,并调用额外的方法。

也许它没有比默认实现返回一个可选项更优雅。

根据“additionalResponse”是什么,它可以在基接口中声明它,向基础实现添加一个返回null(或一个空字符串?)的实现,并将实际实现添加到相应的子类中。

在现实世界中的问题,它通常有助于思考是否另一个开发者可能会为你计划,并可能为此使用它,导致错误的方式实现感到惊讶。

如果你想要去幻想,在Decorator Pattern可能成为候选人。

而子类是经格局大师通常皱起了眉头,因为它是用来往往比合理的,这件事情的人认识和期待。这将是@Zsolt V推荐的解决方案(这里是伪代码 - 可能不会编译):

Collection<XXXCommandHandler> baseHandlers = ApplicationContextManager.getInstance() 
    .getBeansOfType(XXXCommandHandler.class).values(); 
for (XXXCommandHandler baseHandler: basehHandlers) { 
    baseHandler.parse(something); 
    baseHandler.response(); 

    if (baseHandler instanceof XXXCommandHandlerAddtionalresponse.class) { 
    XXXCommandHandlerAddtionalresponse additionalResponseHandler 
     = (XXXCommandHandlerAddtionalresponse) baseHandler: 
    additionalResponseHandler.additionalResponse(); 
    } 
} 

我也会尽力帮助你。从我的角度来看,您可以创建一个接口或直接的类响应,并返回它而不是字符串。在那里你可以添加方法supportsAdditionalResponse并在获得additionalResponse之前检查它。如果不支持additionalResponse,则引发getAdditionalResponse方法UnsupportedOperationException。

从我的角度来看,ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)也不是一件好事,因为您正在公开您的基础结构。如果可能,更好的方法是添加方法List getCommandHandlers()。

public interface Response { 
    String getResponse(); 

    default Boolean supportsAdditionalResponse() { 
     return false; 
    }; 

    default String getAdditionalResponse() { 
     throw new UnsupportedOperationException(); 
    } 
    } 


    public class HttpResponse implements Response { 
    private String response; 

    public HttpResponse(String response) { 
     this.response = response; 
    } 

    @Override 
    public String getResponse() { 
     return response; 
    } 

    } 

    public interface CommandHandler { 
    void parse(String command); 
    Response getResponse(); 
    } 

    public class HttpCommandHandler implements CommandHandler { 
    private final Response response; 

    public HttpCommandHandler(Response response) { 
    this.response = response; 
    } 

    @Override 
    public void parse(String command) { 
    //do smth 
    } 

    @Override 
    public Response getResponse() { 
     return response; 
    } 
}