收藏设计模式

Android设计模式:组合模式

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

组合模式

作用:把一组相似的对象当作一个单一的对象,为的是减少数据类型。

背景描述

快递服务,将全国省市区进行划分。

行政区的划分有三级至五级不等
组织这样一个目录,供客户选择
如果每级区划分使用一个类,需要五个类,太复杂
希望能简化

image.png

图形设计

实现步骤:
1、定义一个抽象对象,它可以表示两种或多种实际类型的对象
2、在对象内部,聚合一个抽象类型对象
3、构造时,递归这种联系
4、适合构造树形结构的对象关系

image.png

代码实例

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
abstract class Node(open var name:String) {
    abstract fun getChildren():List<Node>?

}
package 设计模式8

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
class DistrictNode(override var name:String):Node(name) {
    private var children:MutableList<Node> = ArrayList()
    override fun getChildren(): List<Node> {
        return children
    }
    fun addChildren(node: Node){
        children.add(node)
    }
    fun deleteChild(num:Int){
        children.removeAt(num)
    }

    override fun toString(): String {
        return name+children
    }
}
package 设计模式8

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
class LeafNode(override var name:String):Node(name) {
    override fun getChildren(): List<Node>? {
        return null
    }

    override fun toString(): String {
        return name
    }
}
package 设计模式8

/**
 *@Description
 *@Author PC
 *@QQ 1578684787
 */
fun main() {
    //根目录
    val root = DistrictNode("根")

    //一级目录
    root.addChildren(DistrictNode("上海"))
    root.addChildren(DistrictNode("天津"))
    val districtNode = DistrictNode("北京")
    root.addChildren(districtNode)

    //二级目录
    districtNode.addChildren(DistrictNode("海淀区"))
    districtNode.addChildren(DistrictNode("西城区"))
    val  districtNode2 = DistrictNode("朝阳区")
    districtNode.addChildren(districtNode2)

    //三级目录
    districtNode2.addChildren(LeafNode("三里屯"))
    districtNode2.addChildren(LeafNode("朝阳外街"))


    println(root)

}

测试结果


image.png

应用场景

优点

缺点

上一篇 下一篇

猜你喜欢

热点阅读