前言
设计模式结合需求、设计场景进行学习,会事半功倍
需求
针对老师的手机号、姓名字段进行参数校验,每个字段校验规则有N多条,且校验规则提示只能返回最先不满足的一个条件
校验流程图
如图所示,当我们的校验链路越来越长的时候,会发现我们的代码十分臃肿,定位具体的校验逻辑也十分不方便,因此才诞生了使用责任链模式代码解耦的想法。
责任链模式
主要思想:当前处理者处理任务,处理过程中发现自己无法完成任务,则判断是否有下一个处理者;如果有下一个处理者,则安排下一个处理者处理当前任务,直至最后一个处理者处理为止。
可以看到,图片中只有两个return出口,一个是handler处理当前任务成功后的return,另一个是直到最后一个handler都没有能处理任务则直接return
代码实现
以教师手机号判断举例
手机号校验 - 抽象处理者
abstract class TeacherPhoneChainHandler {
protected var nextHandler: TeacherPhoneChainHandler? = null
fun getNext(): TeacherPhoneChainHandler? { return nextHandler }
fun setNext(next: TeacherPhoneChainHandler) { this.nextHandler = next }
abstract fun handleRequest(teacherPhone: String): Result
}
手机号判空 - 具体处理者
class TeacherPhoneIllegalProcessor: TeacherPhoneChainHandler() {
/**
* 判断教师手机号是否格式正确
*/
override fun handleRequest(teacherPhone: String): Result {
return if (!PhoneUtils.isPhone(teacherPhone)) {
return resultData
} else {
// 当前处理者无法解决,获取下一个具体处理者处理
if (getNext() != null) {
getNext()!!.handleRequest(teacherPhone)
} else {
return resultData
}
}
}
}
手机号判空逻辑 - 具体处理者
class TeacherPhoneImplyProcessor: TeacherPhoneChainHandler() {
/**
* 老师手机号判空
*/
override fun handleRequest(teacherPhone: String): Result {
return if (teacherPhone.isNullOrBlank()) {
return resultData;
} else {
// 当前处理者无法解决,获取下一个具体处理者处理
if (getNext() != null) {
getNext()!!.handleRequest(teacherPhone)
} else {
return resultData
}
}
}
}
调用
// 1、手机号判空
val phoneImplyValid = TeacherPhoneImplyProcessor()
// 2、手机号格式校验
val phoneIllegalValid = TeacherPhoneIllegalProcessor()
// 指定步骤:先判空手机号,再判手机号格式,先不满足条件的先返回
phoneImplyValid.setNext(phoneIllegalValid)
val result = phoneImplyValid.handleRequest(teacherPhone)