scala的trait实现调用链模式
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说scala的trait实现调用链模式,希望能够帮助大家进步!!!
trait实现调用链模式
我们如果要开发一个支付功能,往往需要执行一系列的验证才能完成支付。
例如:
进行支付签名校验
数据合法性校验
如果将来因为第三方接口支付的调整,需要增加更多的校验规则,此时如何不修改之前的校验代码,来实现扩展呢?
责任链模式
trait调用链
类继承了多个trait后,可以依次调用多个trait中的同一个方法,只要让多个trait中的同一个方法在最后都依次执行super关键字即可。类中调用多个tait中都有这个方法时,首先会从最右边的trait方法开始执行,然后依次往左执行,形成一个调用链条。
示例
实现一个模拟支付过程的调用链
步骤
定义一个HandlerTrait特质
定义一个具体的handler方法,打印"处理数据…"
定义一个DataValidHandlerTrait,继承HandlerTrait特质
重写handler方法,打印"验证数据"
调用父特质的handler方法
定义一个SignatureValidHandlerTrait,继承HandlerTrait特质
重写Handler方法
打印"检查签名"
调用父特质的handler方法
创建一个PaymentService类
继承DataValidHandlerTrait
继承SignatureValidHandlerTrait
定义pay方法
打印"准备支付"
调用父特质的handler方法
添加main方法
创建PaymentService对象实例
调用pay方法
参考代码:
代码语言:javascript复制trait HandlerTrait {
def handle(data:String) = println("处理数据...")
}
trait DataValidHanlderTrait extends HandlerTrait {
override def handle(data:String): Unit = {
println("验证数据...")
super.handle(data)
}
}
trait SignatureValidHandlerTrait extends HandlerTrait {
override def handle(data: String): Unit = {
println("校验签名...")
super.handle(data)
}
}
class PayService extends DataValidHanlderTrait with SignatureValidHandlerTrait {
override def handle(data: String): Unit = {
println("准备支付...")
super.handle(data)
}
}
def main(args: Array[String]): Unit = {
val service = new PayService
service.handle("支付参数")
}
// 程序运行输出如下:
// 准备支付...
// 检查签名...
// 验证数据...
// 处理数据...
结果:
今天文章到此就结束了,感谢您的阅读,Java架构师必看祝您升职加薪,年年好运。