当前位置: 首页 > 面试题库 >

如何在面向服务的体系结构中处理Java多态性

桂坚
2023-03-14
问题内容

在面向服务的体系结构中处理实体类型的多态性和继承时,最不邪恶的道路是什么?

SOA的原理(据我所知)是将实体类作为纯数据构造,而没有任何业务逻辑。所有业务逻辑都包含在范围狭窄,松耦合的服务中。这意味着服务实现应尽可能小,以进一步促进松散耦合,并且意味着实体避免必须了解系统可能对其执行的
每种 行为。

,因此服务实现中的任何多态行为都将替换为一系列条件检查object.getClass()或using
instanceof。在OOPL中,这似乎相当落后。

使用条件句是SOA中公认的规范吗?是否应该放弃实体中的继承?

更新

我绝对是指过载而不是覆盖。

我将SOA定义为表示将系统的行为按用例分组为接口,然后通常在每个接口的一个类中实现这些逻辑。因此,这样的实体类(例如Product)只不过是带有getter和setter的POJO。它绝对不应包含与服务相关的任何业务逻辑,因为随后您引入了一个耦合点,实体类需要了解所有可能在其上运行的业务流程,从而完全否定了松耦合SOA的目的。

因此,由于不应在实体类中嵌入特定于业务流程的行为,因此不能将多态与这些实体类一起使用-没有要覆盖的行为。

更新2

上述行为被更简单地解释为 过载 路径被选择在 编译时 ,和 重写 在路径 运行时

对于要作用的域模型类的每个子类型,都有一个服务实现的子类是不好的做法,那么人们如何解决编译时超载问题?


问题答案:

我花了一段时间才从阅读本文中得出您真正要的东西。

我的解释是,您有一组POJO类,在将这些类传递给服务时,您希望该服务能够根据传递给它的特定POJO类执行不同的操作。

通常,我会尽量避免使用宽泛或较深的类型层次结构,并处理需要一种或两种情况的instanceof等。

无论出于什么原因,当必须有一个宽泛的类型层次结构时,我可能会使用下面的处理程序模式。

class Animal {

}
class Cat extends Animal {

}

interface AnimalHandler {
    void handleAnimal(Animal animal);
}

class CatHandler implements AnimalHandler {

    @Override
    public void handleAnimal(Animal animal) {
        Cat cat = (Cat)animal;
        // do something with a cat
    }

}

class AnimalServiceImpl implements AnimalHandler {
    Map<Class,AnimalHandler> animalHandlers = new HashMap<Class, AnimalHandler>();

    AnimalServiceImpl() { 
        animalHandlers.put(Cat.class, new CatHandler());
    }
    public void handleAnimal(Animal animal) {
        animalHandlers.get(animal.getClass()).handleAnimal(animal);
    }
}


 类似资料:
  • 在我们公司,我们正在从一个巨大的单体应用程序过渡到微服务架构。这一决定的主要技术驱动因素是能够独立扩展服务的需求和开发的可扩展性——我们有十个Scrum团队在不同的项目(或“微服务”)中工作。 过渡过程很顺利,我们已经开始受益于这种新的技术和组织结构的优势。现在,另一方面,我们正在努力解决一个主要的痛点:如何管理这些微服务之间依赖关系的“状态”。 让我们举一个例子:其中一个微服务处理用户和注册。该

  • 背景: 我正在构建一个应用程序,建议的体系结构是基于微服务体系结构的事件/消息驱动的。 做事情的单一方式是,我有一个,它操作一些具有直接的命令。因此,响应相同的用户/HTTP请求是“无忧无虑的”。 问题: 用户向UI服务(有多个UI服务)发送一个,该服务向队列(Kafka/RabbitMQ/any)触发一些事件。N个服务拾取该事件/消息,并在此过程中发挥一些魔力,然后在某个时刻,相同的UI服务应拾

  • 我最近开始使用Node.js,我必须构建一个应该使用多个Express.js服务的体系结构。其中一些服务必须位于一台服务器上,另一台则位于其他服务器上。我想构建一个基础服务(像API网关),但是我不知道在这个网关和微服务之间,或者在两个微服务之间进行通信的合适方式是什么。 目前我正在研究一个基于此的解决方案:

  • 总而言之,我们有: 产品类别: 产品ID、产品名称 订单类别: 订单ID、产品ID、用户ID、订单日期 这些方法中的任何一种可以被认为是最佳实践吗?还是有不同的解决方案?

  • 我有一个微服务体系结构,它的日志必须发送到远程Kafka主题。在它旁边,本主题的使用者将把日志发送到麋鹿堆栈(另一个团队) 我想要一个专用的微服务(fwk proxy elasticsearch),其职责是收集其他人的日志,并将其发送到远程Kafka主题。 将从我的微服务聚合的所有日志分派到fwk-代理-弹性搜索微服务的最佳协议是什么? 我希望这个模式不会重复远程Kafka主题的安全配置。我想把它

  • 我知道将实体类和属性复制到DTOs中被认为是反模式,因此通过模式,相同的既可以用作数据库实体类,也可以用作服务层和MVC层的DTO。(参见https://codereview.stackexchange.com/questions/93511/data-transfer-objects-vs-entities-in-java-rest-server-application) 但是假设我们有一个微服