接口隔离原则 - Java的
我有一个接口接口隔离原则 - Java的
interface XXXCommandHandler(){
void parse(String something);
String response();
String additionalResponse();
}
- 一些实现XXXCommandHandler的类不实现additionalResponse()。
- 我使用ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandler.class)得到实现XXXCommandHandler
- 类然后调用分析,应对和additionalResponse
- 由于某些不实现additionalResponse我不得不返回null 。
我能想到的以下
- ,而不是返回空的类没有实现additionalResponse,declaire additionalResponse作为默认的方法和返回null /或使其返回可选等,并覆盖它的在实现additionalResponse方法的类上。
- 丑陋的方式: - 在所有类别中返回NULL没有实现additionalResponse
-
与解析和应对方法和XXXCommandHandlerAddtionalresponse()与additionalResponse方法延长XXXCommandHandlerParser即
接口XXXCommandHandlerParser创建两个不同的接口XXXCommandHandlerParser() (){
void parse(String something); String response(); }
接口XXXCommandHandlerAddtionalresponse() 延伸XXXCommandHandlerParser {
String additionalResponse(); }
但如果我这样做#3,我不得不改变 ApplicationContextManager.getInstance()。getBeansOfType(XXXCommandHandlerAddtionalresponse.class)。
- 如果我做#4,那么没有实现additionalResponse或没有实现XXXCommandHandlerAddtionalresponse的类将不会被拾取。
你能想到任何优雅的方式吗?
它的味道哪种解决方案更优雅的事,但有(至少)一个更路要走:
创建一个顶层接口:了InterfaceA
扩展了InterfaceA到interfaceB与额外的方法。
收藏型了InterfaceA
的豆如果实例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;
}
}
@Mena - 我觉得你的意思是#1在接口默认方法中可选。 –
“我有一个接口'接口XXXCommandHandler(){...'” ......这不是有效的Java。 –
Hari,您仍然需要正确格式化代码以获得更好的可读性 –