首页 > 其他分享 >设计模式--组合模式【结构型模式】

设计模式--组合模式【结构型模式】

时间:2025-01-03 17:33:23浏览次数:3  
标签:得分 组合 -- 模式 public 设计模式 节点

设计模式的分类

我们都知道有 23 种设计模式,这 23 种设计模式可分为如下三类:

  • 创建型模式(5 种):单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。
  • 结构型模式(7 种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
  • 行为型模式(11 种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

在这里插入图片描述

设计模式系列文章传送门

设计模式的 7 大原则

设计模式–单例模式【创建型模式】

设计模式–工厂方法模式【创建型模式】

设计模式–抽象工厂模式【创建型模式】

设计模式–建造者模式【创建型模式】

设计模式–原型模式【创建型模式】

设计模式–适配器模式【结构型模式】

设计模式–装饰器模式【结构型模式】

设计模式–代理模式【结构型模式】

设计模式–外观模式(门面模式)【结构型模式】

设计模式–桥接模式【结构型模式】

什么是组合模式

组合模式又叫作整体-部分模式,它将对象组合成树状的层次结构,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性,是一种结构型模式。

抽象模式的组成

  • 抽象组件:定义组合模式中所有对的通用方法,一般是一个接口或者是一个类。
  • 叶子节点:没有子节点的对象,实现了抽象节点。
  • 组合节点:也叫容器,是一个包含子节点的节点,其子节点可以是叶子节点,也可以是其他容器节点,也实现了抽象组件。

组合模式实现案例

我们以篮球运动中得分方式来做为案例,我们知道篮球运动中得分的方式有三分得分、两分得分、罚球得分,其中篮球运动的得分方式就是抽象组件,三分得分、两分得分、罚球得分就是叶子节点,获取篮球运动的所有得分方式就是组合节点。

组合模式实现案例

我们以篮球运动中得分方式来做为案例,我们知道篮球运动中得分的方式有三分得分、两分得分、罚球得分,其中篮球运动的得分方式就是抽象组件,三分得分、两分得分、罚球得分就是叶子节点,获取篮球运动的所有得分方式就是组合节点。

BasketBallScore(抽象组件)

我们把篮球得分的方式定义为抽象组件,代码如下:

public interface BasketBallScore {

    //获取得分
    int gatScore();

}

ThreeScore(叶子节点)

3分投篮是一种篮球得分方式,ThreeScore 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:

public class ThreeScore implements BasketBallScore{
    @Override
    public int gatScore() {
        System.out.println("命中3分,得到3分");
        return 3;
    }
}

TwoScore(叶子节点)

2分投篮也是一种篮球得分方式,TwoScore 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:

public class TwoScore implements BasketBallScore{

    @Override
    public int gatScore() {
        System.out.println("命中抛投得到2分");
        return 2;
    }

}

PenaltyKick(叶子节点)

罚球得分也是一种篮球得分方式,PenaltyKick 类实现了 BasketBallScore 接口,并实现了得分方法,代码如下:

public class PenaltyKick implements  BasketBallScore{
    @Override
    public int gatScore() {
        System.out.println("命中组合罚球获得1分");
        return 1;
    }
}

CombinationScore(组合节点)

组合节点 CombinationScore 实现了了抽象组件,也实现了得分方式,代码如下:

public class CombinationScore implements BasketBallScore {

    private List<BasketBallScore> scoreList = new ArrayList<>();

    public void addBasketBallScore(BasketBallScore basketBallScore) {
        scoreList.add(basketBallScore);
    }


    @Override
    public int gatScore() {
        int allScore = 0;
        for (BasketBallScore basketBallScore : scoreList) {
            allScore = allScore + basketBallScore.gatScore();
        }
        return allScore;
    }
}

ClientComposite(客户端)

客户端验证获取得分的方式,代码如下:

public class ClientComposite {


    public static void main(String[] args) {
        //叶子节点 3分
        ThreeScore threeScore = new ThreeScore();
        //叶子节点 2分
        TwoScore twoScore = new TwoScore();
        //叶子节点 1分
        PenaltyKick penaltyKick = new PenaltyKick();
        //组合节点 获取所有的得分
        CombinationScore combinationScore = new CombinationScore();
        combinationScore.addBasketBallScore(threeScore);
        combinationScore.addBasketBallScore(twoScore);
        combinationScore.addBasketBallScore(penaltyKick);
        int allScore = combinationScore.gatScore();
        System.out.println("总得分为:" + allScore);
    }

}

执行结果如下:

命中3分,得到3分
命中抛投得到2分
命中组合罚球获得1分
总得分为:6

组合模式的优缺点

优点

  • 提供了统一的标准接口,可以使客户端统一处理单个对象和组合对象,并且不用区分类型,同时也降低了代码复杂性。
  • 增强了代码的灵活性,可以灵活的增加或者删除叶子节点类型,不影响客户端代码。

缺点:

  • 映入组合设计模式在一定程度上会增加系统的复杂性,对系统研发人员的设计能力有一定的要求。
  • 要求所有组件统一接口,有一定的局限性。

组合模式的适用场景

  • 菜单和菜单项,这本身就是一个树状结构。
  • 组织架构和人员管理,这本身也是一个树状结构。
  • 文件系统和目录结构,同样也是一个树状结构。

简而言之,所有树状结构的场景都比较适合使用组合模式。

总结:本篇分享了组合模式的概念和使用,使用了篮球得分的案例进行了代码演示,希望可以帮助理解,也希望可以帮助到有需要的朋友。

如有不正确的地方欢迎各位指出纠正。

标签:得分,组合,--,模式,public,设计模式,节点
From: https://blog.csdn.net/weixin_42118323/article/details/144356826

相关文章

  • Creo许可管理的常见问题及解决方案
    随着工程设计的复杂性和软件使用的普及性增加,Creo许可管理成为了许多企业面临的挑战。本文将解答关于Creo许可管理的常见问题,并提供相应的解决方案,帮助企业更好地管理和利用Creo许可证。常见问题一:许可证分配不均问题描述:在某些情况下,企业可能会遇到许可证分配不均的问题,导致某......
  • AI划时代,新手小白如何利用绘画小赚1万
    一、为什么我要选择AI绘画2023年过完年,国内大模型就火了,各种AI能力感觉一下子进入一个新时代了,各种惊掉人下巴的AI能力层出不穷,其实我是从元旦节左右就开始了解到了openAI的gpt大模型。GPT的出现,确实是跨时代的,GPT的定义是一种基于互联网的、可用数据来训练的、文本生成的......
  • 在jooq的POJO类中使用Lombok的Data注解
    jooq生成pojo类的配置根据官方给的如下:https://www.jooq.org/doc/3.14/manual/getting-started/tutorials/jooq-in-7-steps/jooq-in-7-steps-step3/如果想要使用lombok注解,需要自定义生成器。原生的参数并不足够支持这样做。另外一般也不需要这样做,因为更推荐把生成的代码......
  • 超强AI绘画工具StableDiffusion,SD整合包V4.9 来了 版本win加mac安装包以及搭载PS安装
    众所周知,StableDiffusion是非常强大的AI绘图工具,今天为大家带来的是StableDiffusionSD整合包v4.9版本安装说明。这里带来的安装版本是9月最新整合包sd-webui-aki-v4.9版本。WIN加MAC有需要stablediffusion整合包以及提示词插件,可以扫描下方,免费获取一、整合......
  • JMeter + Grafana +InfluxDB性能监控 (二)
          您可以通过JMeter、Grafana和InfluxDB来搭建一个炫酷的基于JMeter测试数据的性能测试监控平台。      下面,笔者详细介绍具体的搭建过程。安装并配置InfluxDB您可以从清华大学开源软件镜像站等获得InfluxDB的RPM包,这里笔者下载的是influxdb-1.8.0.x86_......
  • Solidigm 宣布正式退出消费级SSD市场:转向数据中心业务
    据最新消息,Solidigm官方宣布其最后一款消费级SSD——P44Pro和P41Plus将不再生产,标志着该公司彻底结束了面向消费者的固态硬盘(SSD)业务。这一决定是在去年解散消费者部门之后做出的,反映了公司战略重心向企业级市场的转移。Solidigm由SK海力士在2021年以90亿美元收购IntelSSD业......
  • 编译原理期末速成总结
    编译原理期末速成词法分析DNA和NFA题型一:NFA->DFA(确定化)NFA的几种构建文法->NFA​1.注意图中的E,F是无效的,不用加在NFA中​2.最后的单独的小b其实对应了终态转换函数->NFA转换函数其实就是关系,按照关系画图即可正规式->NFA​1.右上角的图提供了准则,......
  • Elasticsearch的分词功能
    关注我,持续分享逻辑思维&管理思维&面试题;可提供大厂面试辅导、及定制化求职/在职/管理/架构辅导;推荐专栏《10天学会使用asp.net编程AI大模型》,目前已完成所有内容。一顿烧烤不到的费用,让人能紧跟时代的浪潮。从普通网站,到公众号、小程序,再到AI大模型网站。干货满满。学成后可......
  • 算法导论复习
    概论重要特性输入、输出、确定性、有限性算法描述自然语言、流程图、伪代码、程序代码算法的复杂性时间复杂性、空间复杂性算法的渐进性态O(g(n))上界Ω(g(n))下界Θ(g(n))确界logn<n<nlogn<n2<n3<2nNP完全理论能在多项式时间内求解的判定性问题称为P问题,在多......
  • matlab-数字滤波器设计与实战
    文章目录数字滤波器设计FIR滤波器设计IIR滤波器设计巴特沃斯滤波器切比雪夫I型滤波器切比雪夫II型椭圆滤波器线性相位与非线性相位零相位响应数字滤波器实战数字滤波器产生延迟的主要原因补偿滤波引入的延迟补偿常量滤波器延迟补偿与频率......