• 设计模式-组合模式


    设计模式-组合模式

    什么是组合模式设计模式?

    组合模式是一种结构型设计模式,它允许将对象组合成树状结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    在组合模式中,有两种主要类型的对象:叶子对象和组合对象。叶子对象是没有子对象的基本对象,而组合对象是包含子对象的复合对象。组合对象可以是叶子对象或其他组合对象的集合。

    组合模式的主要思想是通过将对象组合成树状结构来表示对象之间的整体-部分关系,使得用户可以统一地处理单个对象和组合对象。这种设计模式可以使得客户端代码更加简洁,不需要对单个对象和组合对象进行特殊处理。

    组合模式的优点包括:

    1. 简化客户端代码:客户端可以一致地处理单个对象和组合对象,不需要对它们进行特殊处理。
    2. 增加新的组件:可以很容易地增加新的叶子对象或组合对象,而不需要修改现有的代码。
    3. 灵活性:可以灵活地组合对象,构建出不同层次的复杂结构。

    组合模式的缺点包括:

    1. 可能会导致设计过于一般化:组合模式可能会导致设计过于一般化,使得系统变得复杂。
    2. 可能会降低系统性能:由于组合对象的嵌套层次可能很深,可能会导致系统性能下降。

    组合模式在实际应用中常用于处理树状结构的数据,例如文件系统、图形界面中的控件等。

    java示例

    下面是一个使用Java实现组合模式的简单案例:

    import java.util.ArrayList;
    import java.util.List;
    
    // 抽象组件类
    abstract class Component {
        protected String name;
    
        public Component(String name) {
            this.name = name;
        }
    
        public abstract void operation();
    }
    
    // 叶子组件类
    class Leaf extends Component {
        public Leaf(String name) {
            super(name);
        }
    
        @Override
        public void operation() {
            System.out.println("Leaf " + name + " operation");
        }
    }
    
    // 复合组件类
    class Composite extends Component {
        private List<Component> components = new ArrayList<>();
    
        public Composite(String name) {
            super(name);
        }
    
        public void add(Component component) {
            components.add(component);
        }
    
        public void remove(Component component) {
            components.remove(component);
        }
    
        @Override
        public void operation() {
            System.out.println("Composite " + name + " operation");
            for (Component component : components) {
                component.operation();
            }
        }
    }
    
    public class CompositePatternExample {
        public static void main(String[] args) {
            // 创建树状结构
            Composite root = new Composite("Root");
            root.add(new Leaf("Leaf 1"));
            root.add(new Leaf("Leaf 2"));
    
            Composite branch = new Composite("Branch 1");
            branch.add(new Leaf("Leaf 3"));
            branch.add(new Leaf("Leaf 4"));
    
            root.add(branch);
    
            // 调用操作方法
            root.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
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在上述例子中,我们定义了一个抽象组件类 Component,其中包括一个 name 属性和一个抽象方法 operation()。叶子组件类 Leaf 继承自抽象组件类,实现了 operation() 方法。复合组件类 Composite 继承自抽象组件类,内部维护了一个 components 列表,可以添加和移除子组件。复合组件类还重写了 operation() 方法,用于调用子组件的 operation() 方法。

    CompositePatternExample 类的 main() 方法中,我们创建了一个树状结构,包括根节点和两个叶子节点。其中一个叶子节点下面还有一个分支节点和两个叶子节点。最后,我们调用根节点的 operation() 方法,会递归地调用所有子组件的 operation() 方法。

    运行上述代码,输出结果如下:

    Composite Root operation
    Leaf Leaf 1 operation
    Leaf Leaf 2 operation
    Composite Branch 1 operation
    Leaf Leaf 3 operation
    Leaf Leaf 4 operation
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    可以看到,通过组合模式,我们可以统一地处理单个对象和组合对象,实现了树状结构的操作。

  • 相关阅读:
    ts中高阶类型的理解
    圆满落幕!回顾 eBPF 技术的发展与挑战
    利用对数器验证算法代码程序
    protobuf全局环境搭建
    Java.lang.Class类 getName()方法有什么功能呢?
    C# Event (1) —— 我想搞个事件
    canvas基础2 -- 形状
    DHCP服务初探
    树莓派 Raspberry Pi 与YOLOv8 结合进行目标检测
    Android Camera 测试环境搭建:Android 原生代码下载
  • 原文地址:https://blog.csdn.net/wangxinxinsj/article/details/133420915