组合模式~

1. 组合模式

1.1 介绍

组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。

将对象组成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

1.2 优缺点

优点

  • 高层模块调用简单。
  • 节点自由增加。

缺点

  • 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则

1.3 使用场景

它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

1.4 注意事项

2. 案例代码

现在我有了好看的娃娃挂在车里,但是我觉得还是不够,我又去买了一个俄罗斯套娃,套娃套娃套娃~,瞬间我的奥迪车B格就上来了。

public class Matryoshka {	// 俄罗斯套娃 Matryoshka
    private String name;
    private Matryoshka matryoshka;

    public Matryoshka(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Matryoshka getMatryoshka() {
        return matryoshka;
    }

    public void setMatryoshka(Matryoshka matryoshka) {
        this.matryoshka = matryoshka;
    }
}

public class Car {
    private Matryoshka matryoshka;

    public Matryoshka getMatryoshka() {
        return matryoshka;
    }

    public void setMatryoshka(Matryoshka matryoshka) {
        this.matryoshka = matryoshka;
    }
}

/**
 * 组合模式
 *
 *@Author cly
 *@Date 2021/08/31 16:17
 *@Version 1.0
 */
public class Combination {
    public static void main(String[] args) {
        Car car = new Car();
        car.setMatryoshka(new Matryoshka("套娃1"));
        car.getMatryoshka().setMatryoshka(new Matryoshka("套娃2"));
        car.getMatryoshka().getMatryoshka().setMatryoshka(new Matryoshka("套娃3"));

        System.out.println(car.getMatryoshka().getName());
        System.out.println(car.getMatryoshka().getMatryoshka().getName());
        System.out.println(car.getMatryoshka().getMatryoshka().getMatryoshka().getName());
    }
}

3. 源码实现

3.1 java.awt.container

JDK 的 AWT(Abstract Window Toolkit),使用了组合模式。AWT 中包含了两种组件:容器组件和基本组件。

  • 容器组件是 java.awt.Container 的子孙类
  • 基本组件是 java.awt.Component 的子孙类
  • 容器组件和基本组件都是 java.awt.Component 的子孙类

Container 类中包含了很多基本组件或容器,放在 ArrayList 中

public class Container extends Component {
    private java.util.List<Component> component = new ArrayList<>();
    
    //向容器类中添加基本组件或容器
    public Component add(Component comp) {
        addImpl(comp, null, -1);
        return comp;
    }
}

基本组件与容器组件,构成了树状结构。由于都是 Component 的子孙类,对 Component 定义的方法,访问上具有一致性。

3.2 java.util.HashMap

在HashMap中也会用到组合模式,比如下方的K可能就是HashMap类型的。

public V put(K key, V value) {
    return putVal(hash(key), key, value, false, true);
}

除此之外,容器类基本能实现组合模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值