我有一个Java应用程序,它由一组服务组成。这些服务需要通过IOAdapter接口处理的I / O,如下所示:
interface IOAdapter {
void info(Object arg);
void error(Throwable cause);
String read(String prompt);
boolean confirm(String prompt);
}
在服务方法中,使用组合到服务实例中的适配器的某些实现来获得输入。然后,此适配器处理所有I / O(用户交互),从而允许将该关注点与实际业务逻辑分离。
例如,典型的方法方法可以执行以下操作:
class MyService {
IOAdapter adapter;
MyService () {
adapter = new MyAdapter(); // some implementation
}
void doSomething() {
try {
...
String val = adapter.read("Enter a value: ");
if(adapter.confirm("Are you sure?")) {
adapter.info("Value entered is: " + val);
...
} else {
doSomething();
}
} catch (Exception e) {
adapter.error(e);
...
}
}
}
现在我能够实现一个通过Java控制台执行I / O的适配器。但是,如果我要为通过浏览器进行I / O的基于Web的适配器提供实现,有人可以建议一种可能的方法吗?
是否有其他方法可以更直接地解决这个问题?
答案 0 :(得分:1)
如果我理解正确,您希望在自己的服务中包含HTTP服务器的功能,实现IOAdapter
接口。我认为interface IOAdapter
在MyService
类中编写和使用MyHTTPAdapter
的方式并不“美观”。这是因为即使您编写adapter.read
,也无法使用HTTP实现read
方法。
在HTTP中,我们有两个实体进行通信。 客户端发送,服务器响应。这不能使用您建议的此接口建模,因为您只对一个实体建模并且只有一种方法来交换数据,方法interface
。您必须改变界面设计,专注于客户端 - 服务器设计,然后您可以包装HTTP通信。
编辑:
集成两种通信范例(控制台通信和HTTP通信)并非易事。我会提出一个由//This should be implemented by either the HTTP or the console server Adapter
interface IOAdapter {
IOResponse serveRequest(IORequest request);
}
//This interface should be implemented by both models of IOAdapter
//For example, a subclass of string could also implement this interface in
//order to unify the two models
interface IORequest {
}
//This interface should be implemented by both models of IOAdapter
//For example, a subclass of string could also implement this interface in
//order to unify the two models
interface IOResponse {
}
强加的设计,遵循HTTP强加的客户端 - 服务器架构,假设控制台应用程序也可以实现它:
{{1}}
希望我帮忙!