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

设计模式的分类

我们都知道有 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

组合模式的优缺点

优点

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

缺点:

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

组合模式的适用场景

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值