iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0

介紹

Kotlin 沒有內建轉接器模式,所以沒有很甜的寫法

情境就跟昨天一樣,假如我有兩個會員系統

  1. 家樂福會員:有會員等級功能
  2. 全家會員:有會員年齡功能

今天接到一個需求

  1. 要把家樂福的等級給全家使用
  2. 全家依照年齡分成年輕會員和老人會員

轉接器模式實作

  1. 家樂福介面
interface Carrefour {
    fun getLevel(): String
}
  1. 全家介面
interface Family {
    fun setAge(age: Int)

    fun getAge(): Int
}
  1. 家樂福會員實作
class CarrefourMember : Carrefour {
    override fun getLevel(): String {
        return "Gold"
    }
}
  1. 全家會員實作,跟 Java 的差別是 age 要給初始值,這也是 Kotlin 的優點
class FamilyMember : Family {

    private var age: Int = -1

    override fun setAge(age: Int) {
        this.age = age
    }

    override fun getAge(): Int {
        return age
    }
}
  1. 建立家樂福轉全家轉接器,跟 Java 的差別是建構子不用另外寫
class Adapter(private val family: Family) : Carrefour {

    override fun getLevel(): String {

    }
}
  1. 全家依照年齡分成年輕會員和老人會員,跟 Java 的差別是 if 表達式直接賦值給變數,看了就是舒服
class Adapter(private val family: Family) : Carrefour {

    override fun getLevel(): String {
        val level = if (family.getAge() > 36) {
            "Old"
        } else {
            "Young"
        }
        return level
    }
}

轉接器模式測試

  1. 測試案例
//建立老會員
val familyOld = FamilyMember()
familyOld.setAge(40)
val carrefourOld: Carrefour = Adapter(familyOld)
val levelOld = carrefourOld.getLevel()

//建立新會員
val familyYoung = FamilyMember()
familyYoung.setAge(25)
val carrefourYoung: Carrefour = Adapter(familyYoung)
val levelYoung = carrefourYoung.getLevel()
val text = StringBuilder()

text.append("\n")
text.append("40歲會員等級:")
text.append(levelOld)
text.append("\n")
text.append("25歲會員等級:")
text.append(levelYoung)
text.append("\n")

assertEquals("測試", text)
  1. 執行測試
40歲會員等級:Old
25歲會員等級:Young

上一篇
113/12 - 轉接器模式(Adapter)- Java
下一篇
113/14 - 裝飾模式(Decorator)- Java
系列文
肯定會斷賽之在 Android 開發使用設計模式30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言