一周两个设计模式—设计模式之组合模式(第五周)

举报
浮生闲半日 发表于 2021/11/22 18:37:47 2021/11/22
【摘要】 业务场景:书接上文,小犬愉快的帮助哪吒完成了天庭咖啡馆的项目,并且帮助哪吒完成了考试,所以天王和哪吒偷偷的给了小犬一个大大的红包。项目完结后,小犬现在是过着幸福的生活,白天陪着玉兔逛逛街,晚上987,简直不要太爽,就这样过了几个月奢靡的生活,这一天一大早小犬的手机响了,一看,我靠,李天王,难道是系统出问题了,赶紧接。“小犬啊,你做的系统太好了”,结果传来了夸奖的话,赶紧谦虚一下“都是主人的功...

业务场景:

书接上文,小犬愉快的帮助哪吒完成了天庭咖啡馆的项目,并且帮助哪吒完成了考试,所以天王和哪吒偷偷的给了小犬一个大大的红包。
项目完结后,小犬现在是过着幸福的生活,白天陪着玉兔逛逛街,晚上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()
}
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。