设计模式 之 —— 组合模式

目录

什么是组合模式?

定义

特点

结构

组合模式(java代码示例)

首先定义接口 

定义叶节点(Leaf类)

定义容器节点(Composite类)

测试类:

树形图

运行结果:

组合模式的优缺点

优点:

缺点:


什么是组合模式?

定义

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

特点

树状层次结构:可以形成一个树的层次结构,很好地反映部分-整体的关系

单一接口:组合模式为所有的组件(叶子或容器)定义了一个统一的接口

动态组合:客户端可以在运行时动态地添加或删除组件(叶子或容器)

结构

  • Component接口:定义了所有对象必须实现的操作。
  • Leaf类:实现Component接口,代表树中的叶子节点。
  • Composite类:同样实现Component接口,并包含其他Component对象的集合。

组合模式(java代码示例)

首先定义接口 

interface Component {
    //定义了所有对象必须实现的操作
    void operation();
}

定义叶节点(Leaf类)

// 叶节点
class Leaf implements Component {
    private String name;

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

    public void operation() {
        System.out.println("叶节点 " + name + " 执行操作");
    }
}

(实现Component接口)

定义容器节点(Composite类)

// 容器节点
class Composite implements Component {
    private String name;
    private List<Component> children = new ArrayList<>();

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

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }

    public void operation() {
        System.out.println("容器节点 "+ name +" 执行操作:");

        for (Component component : children) {
            component.operation();
        }
    }
}

(实现Component接口)

测试类:

//测试类
public class CompositePatternDemo {
    public static void main(String[] args) {
        // 创建叶节点
        Component leaf1 = new Leaf("Leaf 1");
        Component leaf2 = new Leaf("Leaf 2");

        // 创建容器节点
        Composite composite = new Composite("总容器");
        //把叶子节点添加到容器节点(也可把其它容器添加到容器节点)
        composite.add(leaf1);
        composite.add(leaf2);

        Component leaf3 = new Leaf("Leaf 3");
        Component leaf4 = new Leaf("Leaf 4");
        Composite composite2 = new Composite("小容器");
        composite2.add(leaf3);
        composite2.add(leaf4);
        composite.add(composite2);

        //composite.remove(composite2);//移除

        // 执行操作
        composite.operation();
    }
}
树形图

我写的上述代码的树形结构图如下:

运行结果:

组合模式的优缺点

优点:

客户端可以一致地处理单个对象和组合对象,不需要关心它们的具体类型(简化了客户端代码的编写和维护)

可以很容易地向树状结构中添加新的组件,而不需要修改现有的代码(提高了系统的灵活性和可扩展性)

部分-整体层次结构:更容易反映现实中事物的自然层次(有助于开发更加贴近现实的系统)

客户端不需要关心对象的组合结构,可以直接调用方法来操作树状结构中的元素(降低了客户端的复杂性)

缺点:

增加了设计的复杂度(组合模式需要引入许多新的类,如抽象构件、叶子和容器)

可能限制组件的类型:组合模式要求组件和叶子节点具有相同的接口,这可能会限制组件的类型(例如,所有的组件都必须实现相同的操作,即使某些组件并不需要这些操作)

对于复杂的树状结构,遍历操作的复杂度会较高。

组合模式的一个优点和缺点都是透明性:客户端不需要知道它是在处理单个对象(Leaf)还是组合对象(Composite)
但是,这种透明性也可能带来问题:客户端无法区分单个对象和组合对象,可能会导致误用或错误使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值