iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Mobile Development

肯定會斷賽之在 Android 開發使用設計模式系列 第 23

113/23 - 責任鏈模式(Chain of Responsibility)- Kotlin

  • 分享至 

  • xImage
  •  

介紹

Kotlin 沒有責任鏈模式的語法糖,所以寫起來就跟 Java 類似,但是 Koltin 的防空值設計,可以讓我們少寫一些空值判斷,還是很棒的

責任鏈模式實作

  1. 建立請求,也可以說是要傳遞的資料,例如這次我們就用 type 來決定家樂福還是全家要接下這個工作
data class ApplyRequest(
    var type: String
)
  1. 設定購物中心抽象類,讓家樂福和全家都繼承他
abstract class Mall(var name: String) {
    var superior: Mall? = null
    abstract fun apply(applyRequest: ApplyRequest): String
}
  1. 建立全家,如果類別是超商才會執行
class FamilyMark(name: String) : Mall(name) {
    override fun apply(applyRequest: ApplyRequest): String {
        val text: String

        if ("超商" == applyRequest.type) {
            text = "這是超商類別,執行"
        } else {
            text = "這不是超商類別,不執行"
            superior?.apply(applyRequest)
        }

        return text
    }
}
  1. 建立家樂福,如果類別是商場才會執行
class Carrefour(name: String) :Mall(name) {
    override fun apply(applyRequest: ApplyRequest): String {
        val text: String

        if ("商場" == applyRequest.type) {
            text = "這是商場類別,執行"
        } else {
            text = "這不是商場類別,不執行"
            superior?.apply(applyRequest)
        }

        return text
    }
}

責任鏈模式測試

  1. 測試案例
    • 把類別設定為超商,看全家會不會執行
    • 把類別設定為商場,看全家會不會執行
    • 把類別設定為超商,看家樂福會不會執行
    • 把類別設定為商場,看家樂福會不會執行
class KotlinTest {

    @Test
    fun show() {

        val text = StringBuilder()
        text.append("\n")

        val familyMark: Mall = FamilyMark("全家")
        val carrefour: Mall = Carrefour("家樂福")

        text.append("店名:")
        text.append(familyMark.name)
        familyMark.superior = carrefour
        
        text.append("\n")

        val applyRequest = ApplyRequest("超商")
        text.append(familyMark.apply(applyRequest))

        text.append("\n")

        applyRequest.type = "商場"
        text.append(familyMark.apply(applyRequest))

        text.append("\n")
        text.append("\n")

        text.append("店名:")
        text.append(carrefour.name)

        text.append("\n")
        applyRequest.type = "超商"
        text.append(carrefour.apply(applyRequest))

        text.append("\n")
        applyRequest.type = "商場"
        text.append(carrefour.apply(applyRequest))

        text.append("\n")

        assertEquals("測試", text.toString())
    }
}
  1. 執行測試
店名:全家
這是超商類別,執行
這不是超商類別,不執行

店名:家樂福
這不是商場類別,不執行
這是商場類別,執行

上一篇
113/22 - 責任鏈模式(Chain of Responsibility)- Java
下一篇
113/24 - 樣版模式(Template)- Java
系列文
肯定會斷賽之在 Android 開發使用設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言