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

文章目录

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

定义

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

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

举例

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

csharp 复制代码
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();
    }
}

抽象类

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

文件系统常用

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

相关推荐
晨米酱18 小时前
JavaScript 中"对象即函数"设计模式
前端·设计模式
数据智能老司机1 天前
精通 Python 设计模式——分布式系统模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——并发与异步模式
python·设计模式·编程语言
数据智能老司机1 天前
精通 Python 设计模式——测试模式
python·设计模式·架构
数据智能老司机1 天前
精通 Python 设计模式——性能模式
python·设计模式·架构
使一颗心免于哀伤1 天前
《设计模式之禅》笔记摘录 - 21.状态模式
笔记·设计模式
数据智能老司机2 天前
精通 Python 设计模式——创建型设计模式
python·设计模式·架构
数据智能老司机2 天前
精通 Python 设计模式——SOLID 原则
python·设计模式·架构
烛阴2 天前
【TS 设计模式完全指南】懒加载、缓存与权限控制:代理模式在 TypeScript 中的三大妙用
javascript·设计模式·typescript
李广坤2 天前
工厂模式
设计模式