首页 > 解决方案 > 使用哪种设计模式来避免重复数据并一次又一次地发送相同的请求?

问题描述

有两个类 A 类和 B 类,两个类都使用相同的数据,我使用 HTTP 请求来获取数据。现在,由于这两个类都使用相同的数据,我可以利用继承并使用数据。但是每次我创建 A 类的实例时,它都会向服务器发送请求,而 B 类也会发生同样的事情。除了发送两个请求之外,是否有任何设计可以发送一个请求以及何时创建 A 类的对象或B类相同的数据将在不发送新请求的情况下使用?这是示例代码。

Class Parent {
   type data;
   requestService;

   constructor(){
      //retrieve data.
      this.data = this.getData();
   }

   getData(){
     //request server to get the data.
     requestService.getDataFromServer();
   }
}

Class A extends Parent{
   action(){
     //custom implementation for class A using data.   
   }
}

Class B extends Parent{
   action(){
     //custom implementation for class B using data.   
   }
}

在两个类之上使用相同的数据,但每个类的实现都发生了变化。现在我将只创建两个对象,一个是 A 类型,另一个是 B 类型。所以现在如果我创建 A 和 B 的对象,我将请求服务器两次,即使两个请求的响应数据将相同。所以我想发送一次请求,当我创建类型 A 和 B 的对象时,我将使用相同的数据而不是再次发送请求。有什么办法可以做到这一点吗?

标签: javaoopdesign-patterns

解决方案


您需要使用观察者模式。当使用观察者模式时,A 和 B 类成为您的观察者,您的数据(HTTP 请求)将成为发布者。

观察者模式- 定义对象之间的一对多依赖关系,这样当一个对象改变状态时,它的所有依赖关系都会自动得到通知和更新。

主题接口- 对象使用此接口注册为观察者,也可以将自己移除为观察者。

观察者- 所有潜在的观察者都需要实现观察者接口。

ConcreteSubject - 始终实现主体。除了注册和删除方法外,具体主体还实现了 notifyobservers() 方法,用于在状态更改时更新所有当前观察者。

ConcreteObserver - 可以是任何实现 Observer 接口的类。每个观察者注册一个具体的主题以接收更新。

在您的情况下,主题类可以定义如下

interface Parent{
void registerObserver();
void removeObserver();
notifyObserver();
}

那么你Parent class应该实现Parent。registerObserver方法应该能够注册其他类 A 和 B 或任何其他需要父数据的类。removeObserver应该能够删除这些类。

class ParentImpl implements Parent{
  void registerObserver(){...}
  void removeObserver(){....}
  void notifyObserver(){...}
  getData(){....}
}

然后观察者类将有一个简单的类定义如下

interface Observer{
  void update();
}

最后,您的 A 类和 B 类将实现 Observer

class B implements Observer{
.......
}

与 B 类或任何需要使用父数据的新类相同。

class A implements Observer{
......
}

推荐阅读