设计模式收藏

Android设计模式:责任链模式

2022-01-17  本文已影响0人  搬码人

责任链模式

简介:将请求传递给一个接受者链,由链将请求流传给目标对象

背景

继续上次的问题背景,Jack的水果店现在支持同时叠加使用不同的优惠券。

实现设计

设计

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()

        }
    }
}

测试结果


image.png

应用场景

优点

  • 代码的解耦,请求者和处理者隔离分开。
  • 易于扩展,新增处理者往链上加结点即可。

缺点

  • 责任链过长的话,或者责任链上的结点判断处理时间太长的话会影响性能,特别是递归循环的时候。
  • 请求有可能遍历完链都得不到处理。
上一篇 下一篇

猜你喜欢

热点阅读