Java 我应该设计JSF页面bean调用多个facade还是单个facade来与系统中的多个模块交互?

Java 我应该设计JSF页面bean调用多个facade还是单个facade来与系统中的多个模块交互?,java,design-patterns,service,Java,Design Patterns,Service,我正在阅读一个系统的代码,并试图理解服务层的设计 我注意到,对于每个对象(要保存到数据库的实体),将创建一组相关的类/实现,如下所示: Product.java ProductDAO.java(接口类) ProductDAOImpl.java ProductService.java(接口类) ProductServiceImpl.java 基于购物车示例,对于客户购买的每个产品,我都必须执行以下事务: 减少产品的数量 保存订单 为批处理作业创建通知记录,以发送电子邮件通知客户 我应该如何设计/实

我正在阅读一个系统的代码,并试图理解服务层的设计

我注意到,对于每个对象(要保存到数据库的实体),将创建一组相关的类/实现,如下所示:

  • Product.java
  • ProductDAO.java(接口类)
  • ProductDAOImpl.java
  • ProductService.java(接口类)
  • ProductServiceImpl.java
  • 基于购物车示例,对于客户购买的每个产品,我都必须执行以下事务:

  • 减少产品的数量
  • 保存订单
  • 为批处理作业创建通知记录,以发送电子邮件通知客户
  • 我应该如何设计/实现它

    方法#1

    方法#2

    方法#2是一条可行之路,因为它将您的业务逻辑封装在服务层中,从而允许您遵循DRY(即不要重复自己)原则


    比如说,今天,您只为您的桌面网站实现了(下单)功能。将来,如果你需要在你的Android应用程序中添加相同的内容,如果你使用方法2,你将能够重用ShoppingCartService。如果使用方法1,则必须在应用程序中复制业务逻辑。

    正如ketan所说,我更喜欢方法2,但我想就为每个实体创建服务层发表一些评论

    尽管还有其他选择,但为每个实体创建一个DAO是一个好主意。然而,我并不认为为每个实体创建一个服务类(或接口+实现对)

    这样做,您将是多余的,有时会对必须使用哪个服务类感到困惑。在开发服务层时,您必须关注必须实现哪些功能

    例如,如果您有
    订单
    产品
    客户
    实体,那么您可能只需要
    ShoppingManager
    服务类,实现与购物功能相关的方法,例如创建新订单、修改订单、检索客户订单等等


    让一个管理器或服务类调用另一个管理器或服务类并没有什么错,但我认为避免这种情况是明智的,并且开发只调用DAO、代理、WS/REST等的服务类。

    在这种情况下,ProductService、OrderService、NotificationService不会变得多余,如果每个模块实现自己的服务层?“如果每个模块实现自己的服务层”等同于“ProductService、OrderService、NotificationService”,即产品、订单或通知的不同服务。。我不明白你的问题,如果我在我的网站上开发5种类型的服务,即A、B、C、D、E,并且我为每种类型实现一个服务类,即ServiceAImpl、ServiceBImpl等,ProductService、OrderService、NotificationService是否会变得多余?
    public class ShoppingCartPageBeanA {
       private ProductService productService;
       private OrderService orderService;
       private NotificationService notificationService;
    
       public void submit() {
         productService.decreaseProductTotalQuantity(product);  
         orderService.saveOrder(order);
         notificationService.saveNotification(notification);
       }
    }
    
    public class ShoppingCartPageBeanB {
       private ShoppingCartService shoppingCartService;
    
       public void submit() {
         shoppingCartService.saveOrder(order);
       }
    }
    
    public class ShoppingCartServiceImpl {
    
      private ProductDAO productDAO;
      private OrderDAO orderDAO;
      private NotificationDAO notificationDAO;
    
      public void saveOrder(Order order) {
            productDAO.decreaseProductTotalQuantity(order.getProduct);
            orderDAO.saveOrder(order);
            notificationDAO.saveNotification(order.getNotification);
      }
    
    }