iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

介紹

昨天太趕,跟本沒時間好好理解

合成模式由三個部件組成

  1. Component:抽象層,提供介面定義行為
  2. Composite:樹支,擁有樹葉
  3. Leaf:樹葉,結構最末端

依照做法還有分

  1. 安全式合成模式:樹支定義管理方法
  2. 透明式合成模式:抽象層定義管理方法

合成模式實作

  1. 建立 Component 抽象層
/**
 * Component:抽象層,提供介面定義行為
 */
abstract class Component(var name: String) {

    abstract fun add(component: Component)

    abstract fun remove(component: Component)

    abstract fun show(depth: Int): String
}
  1. 建立 Composite 樹支
/**
 * Composite:樹支,擁有樹葉
 */
class Composite(name: String) : Component(name) {

    private val child: ArrayList<Component> = ArrayList()

    override fun add(component: Component) {
        child.add(component)
    }

    override fun remove(component: Component) {
        child.remove(component)
    }

    override fun show(depth: Int): String {
        val text = StringBuilder()

        for (i in 0 until depth) {
            text.append("-")
        }

        text.append("Composite name:$name")

        for (component in child) {
            val show = component.show(depth + 1)
            text.append("\n")
            text.append(show)
        }

        return text.toString()
    }
}
  1. 建立 Leaf 樹葉
/**
 * Leaf:樹葉,結構最末端
 */
class Leaf(name: String) : Component(name) {

    override fun add(component: Component) {
        Log.d("TAG", "樹葉不可新增")
    }

    override fun remove(component: Component) {
        Log.d("TAG", "樹葉不可移除")
    }

    override fun show(depth: Int): String {
        val text = StringBuilder()
        for (i in 0 until depth) {
            text.append("-")
        }

        text.append("Leaf name:$name")

        return text.toString()
    }
}

合成模式測試

  1. 測試程式碼
@Test
fun show() {
    val member = Composite("會員系統");
    val name = Composite("姓名")
    val age = Composite("年齡")
    val level = Composite("等級")
    member.add(name)
    member.add(age)
    member.add(level)
    name.add(Leaf("Andy"))
    name.add(Leaf("Leigh"))
    age.add(Leaf("30"))
    age.add(Leaf("25"))
    level.add(Leaf("Gold"))
    level.add(Leaf("Silver"))
    
    assertEquals("合成模式測試", member.show(0))
}
  1. 輸出結果
Composite name:會員系統
-Composite name:姓名
--Leaf name:Andy
--Leaf name:Leigh
-Composite name:年齡
--Leaf name:30
--Leaf name:25
-Composite name:等級
--Leaf name:Gold
--Leaf name:Silver

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

尚未有邦友留言

立即登入留言