Java结构型模式中的组合模式详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java结构型模式中的组合模式详解

非凡的小笨鱼   2023-03-21 我要评论

一.介绍

组合模式(Composite Pattern)属于结构型模式。组合模式又叫作部分整体模式,它是一种将对象组合成树状层次结构的模式,用来表示整体-部分的关系,使用户对单个对象和组合对象具有一致的访问性。组合模式有透明方式和安全方式两种实现方式

二.UML类图

1.透明方式

  • 抽象节点中定义了规范,客户端无需区别叶子节点和树枝节点,使用方便
  • 叶子节点本来无add、remove、getChild方法,但是因为抽象中定义了规范,所以必须实现它们,会带来一些安全性问题

2.安全方式

  • 客户端需要区别叶子节点和树枝节点,使用不方便
  • 叶子节点无add、remove、getChild方法,不存在安全性问题

三.具体代码

业务代码

//抽象节点
public abstract class Component {
    abstract void add(Component component);
    abstract void remove(Component component);
    abstract Component getChild(int i);
    abstract void operation();
}
//叶子节点
class Leaf extends Component{
    private String name;
    public Leaf(String name) {
        this.name = name;
    }
    @Override
    void add(Component component) {}
    @Override
    void remove(Component component) {}
    @Override
    Component getChild(int i) {
        return null;
    }
    @Override
    void operation() {
        System.out.print(name);
    }
}
//树枝节点
class Composite extends Component{
    private ArrayList<Component> children = new ArrayList<>();
    @Override
    void add(Component component) {
       children.add(component);
    }
    @Override
    void remove(Component component) {
        children.remove(component);
    }
    @Override
    Component getChild(int i) {
        return children.get(i);
    }
    @Override
    void operation() {
        children.forEach(Component::operation);
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Component level1 = new Composite();
        level1.add(new Leaf("1"));
        level1.add(new Leaf("2"));
        Component level2 = new Composite();
        level2.add(new Leaf("2.1"));
        level1.add(level2);
        level1.operation();
    }
}

四.使用场景

  • 需要表示一个对象整体与部分的层次结构
  • 要求对用户隐藏组合对象与单个对象的不同,用户可以使用统一的接口操作组合结构中的所有对象
  • 组织机构树
  • 文件/文件夹

五.优点

  • 简化了客户端代码(客户端一致地处理单个对象和组合对象)
  • 符合开闭原则(新增具体实现类不需要更改源代码)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们