为了账号安全,请及时绑定邮箱和手机立即绑定

这种一对类的情况是否有设计模式?

这种一对类的情况是否有设计模式?

qq_花开花谢_0 2023-03-17 10:24:31
这个问题在我的项目中经常出现。例如,假设我有两个接口,一个从 API 检索信息,另一个解析该信息。public interface APIClient {...}public interface APIParser {...}现在,我可能需要不同的 API,因此我将有许多实现,但APICLient每个实现都需要自己的APIParser.这将导致这种类型的结构public class APIClientA implements APIClient {...}public class APIParserA implements APIParser {...}public class APIClientB implements APIClient {...}public class APIParserB implements APIParser {...}......所以,一般来说,这意味着每次我想添加一种新类型的 API 时,我都必须为同一类型创建几个类,并确保它们只相互通信,而不是与其他的实现通信API 的类型。这看起来与 Bridge 设计模式提出的非常相似,但这种模式将允许任何 APIClient 使用任何 APIParser(我说得对吗?)那么,有更好的解决方案吗?或者也许这很好,不需要重构它。另外,也许解析不是正确的词,对不起我的英语,但我的意思是分析 JSON/XML 响应以便从中获取具体信息。我分析每个响应的方式取决于每个 API 提供的结构,所以这就是为什么我需要不同的“解析器”编辑:我将扩展这个想法。有一个客户端类使用 APIClient 来发出请求,带有给定类型的参数。一旦请求遇到 JSON 响应,客户端就会使用相应的 APIParser 来获取有关响应的特定信息。public class ClientClass {  ...  json = APIClientTypeA.makeRequest(city, day, ...);  temperature = APIParserTypeA.getTemperature(json);  ...}这里的问题是客户端需要确保使用正确的 APIClient 和 APIParser 实现(它们必须匹配)
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您的要求似乎与抽象工厂 GoF模式非常匹配,因为一旦您创建了一个具体工厂并且您的代码仅通过该工厂实例化客户端和解析器,就不可能错误地获得一组不匹配的客户端/解析器实例。

AbstractFactory是您的客户端用来实例化客户端/解析器对的对象:

interface AbstractFactory {

    APIParser createAPIParser();

    APIClient createAPIClient();    

}


interface APIParser {} 

interface APIClient {}

具体工厂可以提供匹配对(您可以重用产品实例,但我保持简单):


class ConcreteFactoryA implements AbstractFactory {


    public APIParser createAPIParser() { return new APIParserA(); }

    public APIClient createAPIClient() { return new APIClientA(); }

}


class ConcreteFactoryB implements AbstractFactory {


    public APIParser createAPIParser() { return new APIParserB(); }

    public APIClient createAPIClient() { return new APIClientB(); }

}

为了完整起见,这里是具体产品的声明:


class APIParserA implements APIParser {}

class APIParserB implements APIParser {}

class APIClientA implements APIClient {}

class APIClientB implements APIClient {}

示例客户端代码:


AbstractFactory factory = new ConcreteFactoryA();

APIClient client = factory.createAPIClient();

APIParser parser = factory.createAPIParser();


查看完整回答
反对 回复 2023-03-17
?
浮云间

TA贡献1829条经验 获得超4个赞

你可以做的是在你的类中添加一个类型参数。


// wrapper for your json

public class APIResult<T extends APIClient<T>> {


    private final String json;


    public APIResult(String json) {

        this.json = json;

    }


    public String getJson() {

        return this.json;

    }

}

// client always returns a result with itself as a type

public interface APIClient<T extends APIClient<T>> {


    APIResult<T> makeRequest();

}

// parser only handles the implementation specific results of one client

public interface APIParser<T extends APIClient<T>> {


    String getTemperature(APIResult<T> result);

}

public class APIClientA implements APIClient<APIClientA> {


    public APIResult<APIClientA> makeRequest() {

        // must return a result with this type

    }

}

public class APIParserA implements APIParser<APIClientA> {


    public String getTemperature(APIResult<APIClientA> result) {

        // only accepts results from one specific client

    }

}


查看完整回答
反对 回复 2023-03-17
  • 2 回答
  • 0 关注
  • 76 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信