Android设计模式:责任链模式
2022-01-17 本文已影响0人
搬码人
责任链模式
简介:将请求传递给一个接受者链,由链将请求流传给目标对象
背景
继续上次的问题背景,Jack的水果店现在支持同时叠加使用不同的优惠券。
实现设计
![](https://img.haomeiwen.com/i20123021/1992f61f1e00ff8d.png)
1、calculate方法内,判断next结点不为null,则继续调用next.calculate;
2、客户端调用时,负责初始化整个责任链。
注:当出现多个对象可以处理同一个请求时,适合责任链模式。
代码实例
/**
*@Description
*@Author PC
*@QQ 1578684787
*/
abstract class MultyDiscount(val nextMultyDiscount: MultyDiscount?):Discount {
abstract override fun calculate(money:Int):Int
}
/**
* 节假日一律减5元
*/
class HolidayMultyDiscount(nextMultyDiscount: MultyDiscount?):MultyDiscount(nextMultyDiscount) {
override fun calculate(money: Int): Int {
var relMoney = 0
if (money>10){
println("假日一律减5元")
relMoney = money-5
}
if (nextMultyDiscount !=null){
return nextMultyDiscount.calculate(relMoney)
}
return relMoney
}
}
class SecondMultyDiscount(nextMultyDiscount: MultyDiscount?):MultyDiscount(nextMultyDiscount) {
override fun calculate(money: Int): Int {
var relMoney = money
println("第二单打九折")
relMoney = (relMoney*0.9).toInt()
if (nextMultyDiscount!=null){
return nextMultyDiscount.calculate(relMoney)
}
return relMoney
}
}
class FullMultyDiscount(nextMultyDiscount: MultyDiscount?):MultyDiscount(nextMultyDiscount) {
override fun calculate(money: Int): Int {
var relMoney = money
if (money>200){
println("优惠满减20元")
relMoney -= 20
}
if (nextMultyDiscount !=null){
return nextMultyDiscount.calculate(relMoney)
}
return relMoney
}
}
测试
class ChainCartClient{
companion object{
private var multyDiscount:MultyDiscount = FullMultyDiscount(null)
init {
multyDiscount = SecondMultyDiscount(multyDiscount)
multyDiscount = HolidayMultyDiscount(multyDiscount)
}
@JvmStatic
fun main(args: Array<String>) {
val banana = Banana("香蕉",40)
val apple = Apple("苹果",50)
val kiwifruit = Banana("猕猴桃",80)
val shopping = OnlineShopping(listOf(banana,apple,kiwifruit))
shopping.setDiscount(multyDiscount)
shopping.submitOrder()
}
}
}
测试结果
![](https://img.haomeiwen.com/i20123021/332fe5039244da8b.png)
应用场景
- 对个对象处理同一请求时,但是具体由哪个对象去处理需要运行时做判断。
- 具体处理者不明确的情况下,向这组对象提交了一个请求。
在Android中的应用:1、Android中的时间分发机制就是类似于责任链模式;2、OKhttp中对请求的处理也是用到了责任链模式。
优点
- 代码的解耦,请求者和处理者隔离分开。
- 易于扩展,新增处理者往链上加结点即可。
缺点
- 责任链过长的话,或者责任链上的结点判断处理时间太长的话会影响性能,特别是递归循环的时候。
- 请求有可能遍历完链都得不到处理。