组合模式
作用:把一组相似的对象当作一个单一的对象,为的是减少数据类型。
背景描述
快递服务,将全国省市区进行划分。
image.png行政区的划分有三级至五级不等
组织这样一个目录,供客户选择
如果每级区划分使用一个类,需要五个类,太复杂
希望能简化
图形设计
实现步骤:
1、定义一个抽象对象,它可以表示两种或多种实际类型的对象
2、在对象内部,聚合一个抽象类型对象
3、构造时,递归这种联系
4、适合构造树形结构的对象关系
代码实例
/**
*@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就是典型的组合实例。
优点
- 高层模块(客户端)调用简单。局部和整体都是同样的结构,客户端无需关心是局部还是整体。
- 新增节点容易。无需对现有类库进行任何更改,符合开闭原则。
缺点
- 不同的组合模式实现有不同的缺点,具体看上面的分析。
网友评论