【发布时间】:2020-05-06 00:50:15
【问题描述】:
interface Server
{
void accept(String xml);
void send();
}
class ServerThatUsesXML implements Server
{
Server server;
@Override
public void accept(String xml) {
if (xml.equals("XML"))
System.out.println("Data accepted successfully.");
else
System.out.println("There was a problem in processing the data.");
}
@Override
public void send() {
server.accept("XML");
}
}
class ServerThatUsesJSON implements Server
{
Server server;
@Override
public void accept(String json) {
if (json.equals("JSON"))
System.out.println("Data accepted successfully.");
else
System.out.println("There was a problem in processing the data.");
}
@Override
public void send() {
server.accept("JSON");
}
}
class Converter
{
public String convertToXML(String json)
{
return "XML";
}
public String convertToJSON(String xml)
{
return "JSON";
}
}
class Adapter implements Server
{
Server xml, json;
Converter converter = new Converter();
public Adapter(Server xml, Server json) {
this.xml = xml;
this.json = json;
}
@Override
public void accept(String input) {
// converter.convertTo...
}
@Override
public void send() {
// converter.convertTo...
}
}
public class Main {
public static void main(String[] args) {
ServerThatUsesXML xml = new ServerThatUsesXML();
ServerThatUsesJSON json = new ServerThatUsesJSON();
xml.server = json;
json.server = xml;
xml.send(); // There was a problem in processing the data.
json.send(); // There was a problem in processing the data.
Adapter adapter = new Adapter(xml, json);
xml.server = adapter;
json.server = adapter;
xml.send();
json.send();
// Both calls should print "Data accepted successfully.".
}
}
在这个例子中,我有两台服务器。不幸的是,一台服务器使用XML,另一台使用JSON。他们都必须相互交流。所以我做了一个适配器,它实现了Server 接口并包含了两个服务器。我希望每当ServerThatUsesXML 向适配器发送内容时,适配器将其转换为JSON 并将其转发给ServerThatUsesJSON。将JSON 请求转换为XML 请求也是如此。
问题在于,由于两个服务器实现了相同的接口,因此两个服务器具有相同的方法和相同的签名。因此,当我在Adapter 上调用accept 时,Adapter 将不知道请求来自哪里以及请求应该去向何方。我应该将它传递给JSON 服务器吗?还是应该将其传递给XML 服务器?
我有两个解决方案,但它们看起来不太干净......所以我想问是否有更好的方法来解决这个问题。
第一个解决方案:检查文本的格式。如果是XML 文本,请将其转换为JSON 并发送至ServerThatUsesJSON。从JSON 转换为XML 的请求也是如此。这种方法可能是最糟糕的,因为它不检查发件人并且仅根据文本格式转发请求。它还通过文本检查格式。这不是那么有效。
第二种解决方案:制作两个适配器,一个接受XML 并发送JSON,另一个接受JSON 并发送XML。然后将第一个传递给ServerThatUsesXML。并将第二个传递给ServerThatUsesJSON。这个解决方案看起来比第一个更好(至少效率更高)。
我的问题是:我可以创建两个 accept 函数,例如 accpetXML 和 acceptJSON 和 accept 函数,根据调用者的类型,我可以调用 XML 版本或JSON 版本。代码应如下所示:
public void accept(String input, ....)
{
if (senderType == ServerThatUsesXML)
acceptJSON(converter.convertToJSON(input));
else
acceptXML(converter.convertToXML(input));
}
【问题讨论】:
-
"每当 ServerThatUsesXML 向适配器发送某些内容时,适配器就会将其转换为 JSON 并将其转发给 ServerThatUsesJSON。",这是否意味着您要发送到适配器时要发送到 JSON-服务器?如果你知道目标服务器接受 JSON,你能不只是将数据转换为 JSON 并直接发送吗?
-
我认为@Lini 的问题是询问您是否可以修改
Server实现以直接使用Converter并消除Adapter。 -
服务器只是一个需要澄清的例子。我的问题都是关于适配器模式的。我没有遇到某个服务器的问题。长话短说,我在问是否有可能根据函数调用者的类型采取不同的行动。
标签: java design-patterns interface adapter