0
点赞
收藏
分享

微信扫一扫

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


目录

​​1.业务需求​​

​​2.业务逻辑剖析​​

​​2.1责任链模式​​

​​ 2.2trait调用链​​

​​3.案例展示​​

​​3.1步骤​​

​​3.2 参考代码​​

1.业务需求

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


  1. 进行支付签名校验
  2. 数据合法性校验
  3. ...

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

2.业务逻辑剖析

2.1责任链模式

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

 2.2trait调用链

【尖叫提示】


  1.   类多继承traint方法的调用顺序和构造器的调用顺序是不一致的。
  2.  类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。
  3. 类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。

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

3.案例展示

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

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

3.1步骤


  1. 定义一个HandlerTrait特质
  • 定义一个具体的handler方法,打印"处理数据..."
  1. 定义一个DataValidHandlerTrait,继承HandlerTrait特质

  • 重写handler方法,打印"验证数据"
  • 调用父特质的handler方法

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

  • 重写Handler方法
  • 打印"检查签名"
  • 调用父特质的handler方法

  1. 创建一个PaymentService类

  • 继承DataValidHandlerTrait
  • 继承SignatureValidHandlerTrait
  • 定义pay方法

  • 打印"准备支付"
  • 调用父特质的handler方法


  1. 添加main方法

  • 创建PaymentService对象实例
  • 调用pay方法


3.2 参考代码

package com.robot.scalademo1

trait HandlerTrait {
def handle(data:String) = println("处理数据..."+data)
}

trait DataValidHanlderTrait extends HandlerTrait {
override def handle(data:String): Unit = {
println("验证数据.."+data)
super.handle(data)
}
}

trait SignatureValidHandlerTrait extends HandlerTrait {
override def handle(data: String): Unit = {
println("校验签名..."+data)
super.handle(data)
}
}

class PayService extends DataValidHanlderTrait with SignatureValidHandlerTrait {
override def handle(data: String): Unit = {
println("准备支付..."+data)
super.handle(data)
}
}

object _08ObjectDemo {

def main(args: Array[String]): Unit = {
val service = new PayService
service.handle("支付参数")
}
}/**
准备支付...支付参数
校验签名...支付参数
验证数据..支付参数
处理数据...支付参数
*/



举报

相关推荐

0 条评论