• 组合模式,宏指令和普通指令的聚合应用(设计模式与开发实践 P10)


    程序设计中有一些 事物是由相似的子事物 构成的例子

    定义

    回顾过去的命令模式,有一些命令里面包含了一个序列的操作,如果你玩魔兽世界或者类似的 MMO 游戏,里面你会用到 宏指令,就是一个指令包含了一系列操作

    那么这个 Macro Command 整合了几个不同的指令对象,形成了一个 树状结构,这就使得我们可以方便地描述 对象部分-整体层次结构

    举例

    这里使用 C# 举例,叶子和容器都属于 Component 类,具有多态性又具有统一性,所以客户调用时无需关注调用的是 组合 还是 子对象

    using System;
    using System.Collections.Generic;
    
    // 组件接口
    public abstract class Component
    {
        protected string name;
    
        public Component(string name)
        {
            this.name = name;
        }
    
        public abstract void PerformAction();
    }
    
    // 叶子组件
    public class Leaf : Component
    {
        public Leaf(string name) : base(name)
        {
        }
    
        public override void PerformAction()
        {
            Console.WriteLine($"执行{name}的操作");
        }
    }
    
    // 容器组件
    public class Composite : Component
    {
        private List<Component> children;
    
        public Composite(string name) : base(name)
        {
            children = new List<Component>();
        }
    
        public void Add(Component component)
        {
            children.Add(component);
        }
    
        public void Remove(Component component)
        {
            children.Remove(component);
        }
    
        public override void PerformAction()
        {
            Console.WriteLine($"执行{name}的操作");
            
            foreach (var child in children)
            {
                child.PerformAction();
            }
        }
    }
    
    // 使用示例
    class Program
    {
        static void Main(string[] args)
        {
            // 创建组件对象
            var root = new Composite("家庭");
            var parent1 = new Composite("父母");
            var parent2 = new Composite("叔叔");
    
            var child1 = new Leaf("孩子1");
            var child2 = new Leaf("孩子2");
            var child3 = new Leaf("孩子3");
    
            // 构建组件树
            root.Add(parent1);
            root.Add(parent2);
            parent1.Add(child1);
            parent1.Add(child2);
            parent2.Add(child3);
    
            // 执行操作
            root.PerformAction();
    
            Console.ReadLine();
        }
    }
    
    • 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
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    抽象类

    上面说到多态性和统一性,组合模式最大的优点就是可以一致地对待组合对象和基本对象,用户只需要知道他是一个命令,不需要知道他是 宏命令 还是 普通命令

    文件系统常用

    文件夹和文件之间的关系很适合用组合模式来描述,文件夹里面可以有 文件夹 也可以有 文件,最终可以组合成一棵树~

  • 相关阅读:
    Halo-Theme-Hao文档:如何设置导航栏?
    LeetCode 104. 二叉树的最大深度
    LeetCode 周赛上分之旅 #47 前后缀分解结合单调栈的贡献问题
    Java 面试题 (二) -------- Java 集合相关
    Ubuntu20.04 安装 Matlab R2021a
    C/C++随笔:指针与const、const数组
    js音频指定扬声器
    Java Map集合的详解
    Java—字节流
    React+Vis.js(01):实现基本的网络图
  • 原文地址:https://blog.csdn.net/Littlelumos/article/details/133629991