转载:Scala系列16:trait实战,trait实现调用链模式
原始链接:https://blog.****.net/qq_26442553/article/details/108421596
Scala系列16:trait实战,trait实现调用链模式
涤生手记 2020-09-05 17:08:24 528 收藏
分类专栏: Scala与Spark从入门到企业开发 文章标签: trait scala trait使用 scala spark 大数据
版权
目录
1.业务需求
我们如果要开发一个支付功能,往往需要执行一系列的验证才能完成支付。例如:
- 进行支付签名校验
- 数据合法性校验
- ...
如果将来因为第三方接口支付的调整,需要增加更多的校验规则,此时如何不修改之前的校验代码,来实现扩展呢?
2.业务逻辑剖析
2.1责任链模式
2.2trait调用链
【尖叫提示】
- 类多继承traint方法的调用顺序和构造器的调用顺序是不一致的。
- 类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。
- 类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。
3.案例展示
实现一个模拟支付过程的调用链
3.1步骤
- 定义一个HandlerTrait特质
- 定义一个具体的handler方法,打印"处理数据..."
- 定义一个DataValidHandlerTrait,继承HandlerTrait特质
- 重写handler方法,打印"验证数据"
- 调用父特质的handler方法
- 定义一个SignatureValidHandlerTrait,继承HandlerTrait特质
- 重写Handler方法
- 打印"检查签名"
- 调用父特质的handler方法
- 创建一个PaymentService类
- 继承DataValidHandlerTrait
- 继承SignatureValidHandlerTrait
- 定义pay方法
- 打印"准备支付"
- 调用父特质的handler方法
- 添加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("支付参数")
-
}
-
}/**
-
准备支付...支付参数
-
校验签名...支付参数
-
验证数据..支付参数
-
处理数据...支付参数
-
*/