On May 23, 2024, 4:08 PM, zelenprog <140063@users.rsdn.org> wrote:
Z>Получается, BusinessObject2 должен сам "переадресовывать" вызовы на другой уровень?
В случае, когда функциональность
BusinessObject2 распределена между двумя уровнями или полностью находится на втором уровне, вы можете использовать подход, основанный на шаблоне "Прокси". Этот подход позволяет объекту на уровне-1 переадресовывать вызовы методов на уровень-2.
Интерфейс BusinessObject2: Определите интерфейс, который будет описывать методы бизнес-объекта.
Прокси для BusinessObject2: Реализуйте прокси-класс, который будет выполнять сетевые запросы для вызова методов на уровне-2.
public interface BusinessObject2 {
int operation1();
int operation2();
// Другие методы
}
public class BusinessObject2Proxy implements BusinessObject2 {
private int id;
private RestClient restClient; // Предположим, что это ваш HTTP клиент
public BusinessObject2Proxy(int id, RestClient restClient) {
this.id = id;
this.restClient = restClient;
}
@Override
public int operation1() {
String url = "http://service2.example.com/api/businessObject2/" + id + "/operation1";
return restClient.get(url, Integer.class);
}
@Override
public int operation2() {
String url = "http://service2.example.com/api/businessObject2/" + id + "/operation2";
return restClient.get(url, Integer.class);
}
// Другие методы
}
@RestController
@RequestMapping("/api/businessObject2")
public class Service2 {
@GetMapping("/{id}/operation1")
public int operation1(@PathVariable int id) {
// Логика выполнения operation1
BusinessObject2 obj = businessLogic.getBusinessObject2ById(id);
return obj.operation1();
}
@GetMapping("/{id}/operation2")
public int operation2(@PathVariable int id) {
// Логика выполнения operation2
BusinessObject2 obj = businessLogic.getBusinessObject2ById(id);
return obj.operation2();
}
// Другие методы
}
public class Service1AnyController {
private Service1Facade mService1Facade;
private RestClient restClient; // Предположим, что это ваш HTTP клиент
public Service1AnyController(Service1Facade pService1Facade, RestClient restClient) {
this.mService1Facade = pService1Facade;
this.restClient = restClient;
}
public int someMethod(int id) {
// Создаем прокси-объект для BusinessObject2
BusinessObject2 lBusinessObject2 = new BusinessObject2Proxy(id, restClient);
// Вызовы методов, которые фактически будут переадресованы на уровень-2
int lRes1 = lBusinessObject2.operation1();
int lRes2 = lBusinessObject2.operation2();
int lSum = lRes1 + lRes2;
return lSum;
}
}
Интерфейс: Интерфейс BusinessObject2 определяет методы, которые должен реализовывать бизнес-объект.
Прокси: Прокси-класс BusinessObject2Proxy реализует интерфейс и содержит логику для переадресации вызовов методов на уровень-2 через сетевые запросы.
REST API: На уровне-2 реализуются соответствующие конечные точки API для обработки запросов и выполнения логики.
Контроллер: Контроллер на уровне-1 использует прокси-объект для взаимодействия с бизнес-логикой на уровне-2. Вызовы методов прокси-объекта фактически переадресуются на уровень-2.
Этот подход позволяет обеспечить слабую связанность между уровнями и скрыть детали сетевых взаимодействий от бизнес-логики, сохраняя при этом чистоту архитектуры.
⸻
❧ “Do not wait for the perfect time and place to enter, for you are already onstage.”