• Java23种设计模式-结构型模式之组合模式


    组合模式(Composite Pattern):将对象组合成树状结构以表示“部分-整体层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。

    通常包含以下几个角色:
    角色1.抽象组件(Component):声明了组合对象和叶子对象的公共接口,让客户端可以统一处理
    角色2.叶子对象(Leaf):实现抽象组件接口表示树结构中的叶节点,不包含子组件。
    角色3.组合对象(Composite)也实现抽象组件接口,包含并管理子组件实现树结构中的分支节点
    角色4.客户端(Client):通过抽象组件接口来操作叶子对象和组合对象

    优点
    1.清晰的结构:能清晰地表达对象的组合关系。
    2.一致性处理:可以一致地处理单个对象和组合对象。
    3.方便扩展:便于添加新的组件或子组件。
    4.安全性:封装了组件的内部结构,提高了安全性。

    缺点
    1.设计复杂组合模式的设计相对复杂,需要考虑对象的层次结构和组合关系。
    2.理解难度增加:对于不熟悉该模式的开发者来说,理解和使用可能会有一定难度。
    3.灵活性受限:由于组合模式的实现方式较为固定,可能会限制一些特殊的需求。
    4.性能影响:在处理大型树状结构时,可能会导致性能问题。

    应用场景如下:
    文件和目录管理:如文件系统中的文件和文件夹。
    组织结构:例如公司的部门和员工层次结构。
    图形界面:窗口、控件等的组合。
    树状数据结构:如二叉树等。

    示例Component 是抽象组件接口,定义了组合模式需要的操作。Leaf 是叶子对象,它实现了 Component 接口。Composite 是组合对象,它也实现了 Component 接口,并管理一组子组件。Client 类展示了如何使用组合模式,它创建了一个组合对象和一个叶子对象,并将叶子对象添加到组合对象中。客户端可以统一调用 operation() 方法,无论是对单个叶子对象还是组合对象

    // 抽象组件接口
    public interface Component {
        void operation();
    }
    // 叶子对象
    public class Leaf implements Component{
        @Override
        public void operation() {
            System.out.println("Leaf is performing operation.");
        }
    }
    // 组合对象
    public class Composite implements Component{
        private List<Component> children = new ArrayList<>();
    
        public void add(Component component){
            children.add(component);
        }
    
        public void remove(Component component){
            children.remove(component);
        }
    
        @Override
        public void operation() {
            for (Component child : children) {
                child.operation();
            }
        }
    }
    
    // 客户端
    public class Client {
        public static void main(String[] args) {
            Component leaf1= new Leaf();
            Component leaf2=new Leaf();
            Composite composite = new Composite();
    
            composite.add(leaf1);
            composite.add(leaf2);
            composite.remove(leaf1);
    
            // 统一处理
            composite.operation();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
  • 相关阅读:
    ES全文检索支持繁简和IK分词检索
    物联网 MQTT 协议
    Redis的缓存雪崩、缓存穿透、缓存击穿
    几个常用的开源数学公式生成软件
    Java后端同第三方服务建立Socket通信①Python编写脚本模拟第三方服务(基础版)
    Hadoop核心源码NameNode启动源码-尚硅谷大数据培训
    leetcode 挑七
    MySQL 内部组件结构以及SQL执行逻辑
    画电路板通用知识
    什么是设备运维管理系统?它对企业有什么帮助?
  • 原文地址:https://blog.csdn.net/csy08845/article/details/138162041