美文网首页收藏设计模式
Android设计模式:组合模式

Android设计模式:组合模式

作者: 搬码人 | 来源:发表于2022-01-13 22:11 被阅读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

    应用场景

    • 表示对象的部分-整体层次结构时。
    • 从一个整体中能独立出部分模块或功能时。
      Android中的应用: ViewGroup和View就是典型的组合实例。

    优点

    • 高层模块(客户端)调用简单。局部和整体都是同样的结构,客户端无需关心是局部还是整体。
    • 新增节点容易。无需对现有类库进行任何更改,符合开闭原则。

    缺点

    • 不同的组合模式实现有不同的缺点,具体看上面的分析。

    相关文章

      网友评论

        本文标题:Android设计模式:组合模式

        本文链接:https://www.haomeiwen.com/subject/xhrpzltx.html