加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 继承和REST API控制器 – 处理子类

发布时间:2020-12-15 03:03:00 所属栏目:Java 来源:网络整理
导读:我有优惠券和交易平台正在开发的以下类层次结构:: Promotion - abstract - Coupon - Sale - Deal (优惠券,促销和交易继承自促销.促销有一个名为type的字符串属性和一个抽象方法,它将子类的类型属性初始化为字符串值.例如,优惠券中的类型获取值“优惠券”等.
我有优惠券和交易平台正在开发的以下类层次结构::
Promotion - abstract
 - Coupon
 - Sale
 - Deal

(优惠券,促销和交易继承自促销.促销有一个名为type的字符串属性和一个抽象方法,它将子类的类型属性初始化为字符串值.例如,优惠券中的类型获取值“优惠券”等. .)

对于每个子类,我有一个DAO和服务类,如CouponDAO,CouponService等.

在前端用户可以通过Angular 2界面创建优惠券或促销或交易,所以我决定拥有以下控制器:

PromotionController - abstract
 - CouponController
 - SaleController
 - DealController

(CouponController,SaleController,DealController继承自PromotionController)

PromotionController将包含所有子类共有的所有常见CRUD函数,在特定控制器中,我将处理针对这些类的特定操作.

A)现在面临的问题是如何实例化来自客户端的正确对象.例如,当用户提交优惠券或促销或交易时,如何实例化正确的对象.例如在PromotionController中,我有一个像这样的函数::

@RequestMapping(value=CREATE_PROMO,method=RequestMethod.POST)
    public ResponseEntity<?> create(@RequestBody Promotion promotion){
        promotionService.save(promotion);
        return new ResponseEntity<>("",HttpStatus.OK); 
    }

抽象的促销是功能的论据.我应该使用工厂模式和**类型**属性来创建正确的对象吗?
例如,如果type =“Coupon”,那么我创建Coupon对象,如果它是“Sale”,那么我创建Sale对象

B)由于控制器使用Services对象,这意味着我必须在PromotionController中声明所有三个服务对象.因为在实例化正确的对象之后,我需要调用其相应的服务来完成这项工作.在上面的方法中,我有promotionService,我认为应该用子类的正确服务替换

C)我正在寻找如何处理REST API,处理现实世界中的子类,就像我上面描述的情况

D)我想通过将所有CRUD操作复制到他们的特定控制器来使我自己变得容易,但似乎这将是重复的代码.

我认为有一种更好的方法可以做到.

我也试过,如果我能找到一个处理这种情况的开源项目,但似乎我找到的所有项目都使用一个类而不是继承.他们的REST / API不处理继承情况

解决方法

在我看来,保持端点简单.从REST API的角度来看,创建单个控制器或仅创建一个控制器,并在控制器层之后使用以下模式.从我所看到的,最好是让REST端点远离继承/重用,并在接收和验证请求后应用它.

要从控制器实例化服务/辅助层,请使用工厂方法模式:

https://en.wikipedia.org/wiki/Factory_method_pattern

创建一个PromotionServiceFactory,它根据促销类型返回PromotionService实现.

在控制器中,使用工厂调用相应的促销服务方法.工厂仍然接受促销类型的论点.

@RequestMapping(value=CREATE_COUPON,method=RequestMethod.POST)
    public ResponseEntity<?> create(@RequestBody Promotion promotion){
//helper if adding one more helper layer. The factory invocation is then //transferred to the helper layer
  PromotionService couponService = promotionServiceFactory.get(PROMOTYPES.COUPON);
couponService.save(promotion);
        return new ResponseEntity<>("",HttpStatus.OK); 
    }

从您的问题来看,似乎有不同促销类型的常见CRUD /其他方法.如果某些步骤/子任务对于每个促销都相同而其他步骤/子任务不同,则这是服务层中模板模式的良好候选.否则,您可以通过创建抽象促销服务来存储常见的CRUD方法.

https://en.wikipedia.org/wiki/Template_method_pattern

使用常用CRUD方法的主要方法和实现创建抽象促销服务.使用各自不同的方法创建其他促销服务类型的单独实现.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读