iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0

介紹

Kotlin 在樣版模式也也也也也沒有語法糖,所以寫法跟 Java 類似

樣版模式實作

  1. 建立抽象會員模版給家樂福和全家使用
    先建立基本的「會員姓名」和「消費金額」
    再建立抽象的「商店名稱」和「是金會員」
abstract class Member {
    var name: String = ""
    var money: BigDecimal = BigDecimal.ZERO

    abstract fun getCompany(): String
    abstract fun isGold(): Boolean
}
  1. 建立註冊流程(registerStart)模版
abstract class Member {
    var name: String = ""
    var money: BigDecimal = BigDecimal.ZERO

    abstract fun getCompany(): String
    abstract fun isGold(): Boolean

    fun registerStart(): String {
        val text = StringBuilder()
        text.append("商店名稱:")
        text.append(getCompany())
        text.append(" / ")
        text.append("會員姓名:")
        text.append(name)
        text.append("\n")
        text.append("消費金額:")
        text.append(money)
        text.append(" / ")
        text.append("是金會員:")
        text.append(isGold())
        text.append("\n")

        return text.toString()
    }
}
  1. 建立家樂福會員,繼承會員模版
    實作金會員判斷,家樂福要超過一千元才能成為金會員
class CarrefourMember : Member() {

    override fun getCompany(): String {
        return "家樂福"
    }

    override fun isGold(): Boolean {
        val isGold: Boolean = money > BigDecimal.valueOf(1000)
        return isGold
    }
}
  1. 建立全家會員,繼承會員模版
    實作金會員判斷,全家只要一元就能成為金會員
class FamilyMarkMember : Member() {
    override fun getCompany(): String {
        return "全家"
    }

    override fun isGold(): Boolean {
        val isGold: Boolean = money > BigDecimal.ONE
        return isGold
    }
}

樣版模式測試

  1. 測試案例
    • 建立家樂福會員,姓名 Andy,消費 1 元
    • 建立家樂福會員,姓名 Jack,消費 2000 元
    • 建立全家會員,姓名 Mark,消費 0 元
    • 建立全家會員,姓名 Rich,消費 10 元
class KotlinTest {

    @Test
    fun show() {

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

        val carrefourMember1: Member = CarrefourMember()
        carrefourMember1.name = "Andy"
        carrefourMember1.money = BigDecimal.ONE
        text.append(carrefourMember1.registerStart())
        text.append("\n")

        val carrefourMember2: Member = CarrefourMember()
        carrefourMember2.name = "Jack"
        carrefourMember2.money = BigDecimal.valueOf(2000)
        text.append(carrefourMember2.registerStart())
        text.append("\n")

        val familyMarkMember1: Member = FamilyMarkMember()
        familyMarkMember1.name = "Mark"
        familyMarkMember1.money = BigDecimal.ZERO
        text.append(familyMarkMember1.registerStart())
        text.append("\n")

        val familyMarkMember2: Member = FamilyMarkMember()
        familyMarkMember2.name = "Rich"
        familyMarkMember2.money = BigDecimal.TEN
        text.append(familyMarkMember2.registerStart())
        text.append("\n")

        assertEquals("測試", text.toString())
    }
}
  1. 執行測試
商店名稱:家樂福 / 會員姓名:Andy
消費金額:1 / 是金會員:false

商店名稱:家樂福 / 會員姓名:Jack
消費金額:2000 / 是金會員:true

商店名稱:全家 / 會員姓名:Mark
消費金額:0 / 是金會員:false

商店名稱:全家 / 會員姓名:Rich
消費金額:10 / 是金會員:true

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

尚未有邦友留言

立即登入留言