Scala系列16:trait实战,trait实现调用链模式

2020-09-28 19:45发布

目录

1.业务需求

2.业务逻辑剖析

2.1责任链模式

 2.2trait调用链

3.案例展示

3.1步骤

3.2 参考代码


1.业务需求

我们如果要开发一个支付功能,往往需要执行一系列的验证才能完成支付。例如:

  1. 进行支付签名校验

  2. 数据合法性校验

  3. ...

如果将来因为第三方接口支付的调整,需要增加更多的校验规则,此时如何不修改之前的校验代码,来实现扩展呢?

2.业务逻辑剖析

2.1责任链模式

 2.2trait调用链

【尖叫提示】

  1.   类多继承traint方法的调用顺序和构造器的调用顺序是不一致的。

  2.  类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。

  3. 类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。

3.案例展示

实现一个模拟支付过程的调用链

3.1步骤

  1. 定义一个HandlerTrait特质

    • 定义一个具体的handler方法,打印"处理数据..."

  2. 定义一个DataValidHandlerTrait,继承HandlerTrait特质

    • 重写handler方法,打印"验证数据"

    • 调用父特质的handler方法

  3. 定义一个SignatureValidHandlerTrait,继承HandlerTrait特质

    • 重写Handler方法

    • 打印"检查签名"

    • 调用父特质的handler方法

  4. 创建一个PaymentService类

    • 打印"准备支付"

    • 调用父特质的handler方法

    • 继承DataValidHandlerTrait

    • 继承SignatureValidHandlerTrait

    • 定义pay方法

  5. 添加main方法

    • 创建PaymentService对象实例

    • 调用pay方法

3.2 参考代码

  1. package com.robot.scalademo1


  2. trait HandlerTrait {

  3. def handle(data:String) = println("处理数据..."+data)

  4. }


  5. trait DataValidHanlderTrait extends HandlerTrait {

  6. override def handle(data:String): Unit = {

  7. println("验证数据.."+data)

  8. super.handle(data)

  9. }

  10. }


  11. trait SignatureValidHandlerTrait extends HandlerTrait {

  12. override def handle(data: String): Unit = {

  13. println("校验签名..."+data)

  14. super.handle(data)

  15. }

  16. }


  17. class PayService extends DataValidHanlderTrait with SignatureValidHandlerTrait {

  18. override def handle(data: String): Unit = {

  19. println("准备支付..."+data)

  20. super.handle(data)

  21. }

  22. }


  23. object _08ObjectDemo {


  24. def main(args: Array[String]): Unit = {

  25. val service = new PayService

  26. service.handle("支付参数")

  27. }

  28. }/**

  29. 准备支付...支付参数

  30. 校验签名...支付参数

  31. 验证数据..支付参数

  32. 处理数据...支付参数

  33. */

作者:涤生手记

链接:https://blog.csdn.net/qq_26442553/article/details/108421596

来源:CSDN
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。