一周两个设计模式—设计模式之组合模式(第五周)
业务场景:
书接上文,小犬愉快的帮助哪吒完成了天庭咖啡馆的项目,并且帮助哪吒完成了考试,所以天王和哪吒偷偷的给了小犬一个大大的红包。
项目完结后,小犬现在是过着幸福的生活,白天陪着玉兔逛逛街,晚上987,简直不要太爽,就这样过了几个月奢靡的生活,这一天一大早
小犬的手机响了,一看,我靠,李天王,难道是系统出问题了,赶紧接。
“小犬啊,你做的系统太好了”,结果传来了夸奖的话,赶紧谦虚一下“都是主人的功劳,我就是个搬砖的”。紧接着天王的话语有传来了
“小犬啊,最近业务太好了,我们正打算开发分店,初步打算开四川分店、天津分店、河北分店和花果山分店,当然分店底下可能还会建立分店,
例如河北分店底下可能有石家庄分店、衡水分店、邯郸分店的,并且每个分店的产品、套餐都会和当地的特色结合,各不相同,这不需要
开发一个系统来管理查看分店,我就想到你这个明日之星了,这次做好了,玉帝可以给你解决编制问题”
我去,编制,这可是个好东西啊!赶紧接下来,就算完成不了不是还有主人了吗?
于是小犬开始了开发之旅。
梳理一下之前使用到的开发模式:桥接、装饰、外观都不符合要求,仔细分一下一下总-》分—》咖啡 总-》分-》分…-》咖啡,最后
肯定是咖啡,上一级可能是套餐、可能是一级分店的分店也可能是一级分店,也可能是总店,怎么感觉和文件管理系统这么相像呢,不对
就是文件系统,我擦,太鸡贼了,居然让我开发一个文件系统,还是问主人吧。
“老大,我想开发一个文件系统,但是无从下手怎么办”。“叫你平时多看看别人的技术博客,没事多看看偷得浮生半日闲的一周两个设计模式系列,
看看里面的组合模式,正是你需要的。”
定义:
组合模式,将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式中的角色:
Component 抽象组件:为组合中所有对象提供一个接口,不管是叶子对象还是组合对象。
Composite 组合节点对象:实现了 Component 的所有操作,并且持有子结点对象。
Leaf 叶结点对象:叶结点对象没有任何子结点,实现了 Component 中的某些操作
组合模式的优点:
1、组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对
象,这简化了客户端代码
2、更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”
组合模式的缺点:
1、设计较复杂,客户端需要花更多时间理清类之间的层次关系
2、不容易限制容器中的构件
3、不容易用继承的方法来增加构件的新功能
组合模式分为透明式的组合模式和安全式的组合模式,区别在于Leaf中不存在添加、删除的操作,是有实现方法。Demo使用透明式的
组合模式。
Component 抽象组件
abstract class Cafe {
lateinit var name:String
var deep:Int = 0
abstract fun add(cafe: Cafe)
abstract fun remove(cafe: Cafe)
abstract fun display()
abstract fun getList():MutableList<Cafe>
}
Composite 组合节点对象
class HeadCafe(name:String,deep:Int):Cafe() {
init {
super.name = name
super.deep = deep
}
var children:MutableList<Cafe> = mutableListOf()
override fun add(cafe: Cafe) {
children.add(cafe)
}
override fun remove(cafe: Cafe) {
children.remove(cafe)
}
override fun getList():MutableList<Cafe>{
return children
}
override fun display() {
children.forEach {
if(it.deep==0){
Log.v("============","我是 ${it.name}")
}else{
Log.v("========","我是 ${it.name}")
show(it)
}
}
}
private fun show(cafe: Cafe){
if(cafe.deep == 0){
Log.v("============","我是 ${cafe.name}")
}else{
cafe.getList().forEach {
if(it.deep==0){
Log.v("============","我是 ${it.name}")
}else{
Log.v("========","我是 ${it.name}")
show(it)
}
}
}
}
}
Leaf 叶结点对象
class Coffee(name:String,deep:Int):Cafe() {
init {
super.name = name
super.deep = deep
}
override fun add(cafe: Cafe) {
}
override fun remove(cafe: Cafe) {
}
override fun display() {
Log.e("============","我是 $name")
}
override fun getList(): MutableList<Cafe> {
return mutableListOf()
}
}
- 点赞
- 收藏
- 关注作者
评论(0)