当前位置: 首页 > 知识库问答 >
问题:

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

强安和
2023-03-14

这个问题在我的项目中经常出现。作为一个例子,假设我有两个接口,一个从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 {...}

...
...

这看起来与Bridge设计模式所建议的非常相似,但是该模式允许任何APIClient使用任何APIParser(我说的对吗?)

那么,有没有更好的解决方案呢?或者也许这很好,不需要重构它。

另外,也许parse不是正确的词,对不起,我的英语,但我想说的是分析一个JSON/XML响应,以便从中获得具体的信息。我分析每个响应的方式取决于每个API提供的结构,所以这就是为什么我将需要不同的“解析器”

我将把这个想法扩展一点。有一个client类使用一个APIClient发出请求,并带有给定类型的参数。一旦请求得到JSON响应,客户机就会使用相应的APIParser来获取关于响应的特定信息。

public class ClientClass {

  ...
  json = APIClientTypeA.makeRequest(city, day, ...);
  temperature = APIParserTypeA.getTemperature(json);
  ...

}

这里的问题是客户端需要确保使用APIClient和APIParser的正确实现(它们必须匹配)

共有1个答案

陈龙野
2023-03-14

您的需求似乎与抽象工厂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();
 类似资料:
  • 我有一个正则表达式挑战给你(我需要你的帮助) 我试图制作一个正则表达式,仅当字符串开头和“bbb”字之间不存在“aaa”时才发现“bbb”。 因此,我构建了以下表达式:

  • 可变模板有很多优点,但在某些情况下,C型可变函数(使用

  • 我有一个粒子模拟项目,我已经工作了很多个小时,我将发布两个类。一个是粒子类,一个是main和Canvas类。我创建一个画布,然后得到它的BufferStrategy和一个Graphics在上面绘制。我使用更新循环来更新每一帧的粒子,并使用渲染循环来渲染每一帧的粒子。更新和渲染都是通过调用粒子数组列表中每个粒子的自渲染和自更新方法来完成的。现在这是我的问题。我有一个MouseListener,它在中

  • 在众所周知的设计书《Domain-Driven Terms》中,它被描述为: 设计模式是命名、抽象和识别对可重用的面向对象设计有用的的通用设计结构。设计模式确定类和他们的实体、他们的角色和协作、还有他们的责任分配。 每一个设计模式都聚焦于一个面向对象的设计难题或问题。它描述了在其它设计的约束下它能否使用,使用它后的后果和得失。因为我们必须最终实现我们的设计模式,所以每个设计模式都提供了例子..代码

  • 在网上搜索和阅读了关于设计模式的文章后,我发现了三种类型,即行为型、创造型和结构型设计模式(GOF)。

  • 问题内容: 因为调用flush()获取每个实体都从内存持久到数据库。因此,如果我使用过多的不必要的flush()调用,可能会花费很多时间,因此对于性能而言不是一个好的选择。这是一种我不知道何时调用flush()的情况? 我的问题是:是否可以避免调用No.1同花顺? 我担心的事情是:为了执行 item.setOrder(ord) ,我们需要ord的数据库ID。而且仅调用 em.persist(ord