简介
责任链模式是一种常见的行为模式。多个处理者对象按照一定顺序排列成链式排列,发起一次请求,会依次沿着这条链被传递和处理,中间处理完成可直接返回。
抽象处理者:该角色对请求进行抽象,并定义一个方法的设定和对下一个处理者的引用。
具体处理者:该角色街道请求后,可以选择将请求处理掉,或者将请求传递给下一个处理者。
示例
抽象处理者
interface Handler {
fun handler(chain : Chain) :String
interface Chain {
fun proceed(request: String): String
fun request(): String
}
}
具体处理者
class HandlerA : Handler {
override fun handler(chain: Handler.Chain) : String{
println("HandlerA start")
var proceed = chain.proceed(chain.request())
println("HandlerA finish")
return proceed
}
}
class HandlerB : Handler {
override fun handler(chain: Handler.Chain) :String {
println("HandlerB start")
var proceed = chain.proceed(chain.request())
println("HandlerB finish")
return proceed
}
}
class HandlerC : Handler {
override fun handler(chain: Handler.Chain) : String {
println("HandlerC start")
var proceed = chain.proceed(chain.request())
println("HandlerC finish")
return proceed
}
}
链式调用
class HandlerChain(var handlers: List<Handler>, var index: Int, var request: String) : Handler.Chain {
override fun proceed(request: String): String {
if (index < handlers.size) {
var next = HandlerChain(handlers, index + 1, request)
var tempHandler = handlers[index]
return tempHandler.handler(next)
}
return ""
}
override fun request(): String {
return request
}
}
主函数调用
fun main(){
val handlerList:ArrayList<Handler> = ArrayList()
handlerList.add(HandlerA())
handlerList.add(HandlerB())
handlerList.add(HandlerC())
val request = HandlerChain(handlerList,0,"request")
request.proceed("request")
}
思考
责任链模式使用是比较灵活的,处理者处理逻辑既可以在内部定义,也可以在外部处理,责任链模式的缺点是当链过长时不方便调试。