组合模式,宏指令和普通指令的聚合应用(设计模式与开发实践 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();
    }
}

抽象类

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

文件系统常用

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

相关推荐
刷帅耍帅37 分钟前
设计模式-享元模式
设计模式·享元模式
刷帅耍帅40 分钟前
设计模式-模版方法模式
设计模式
刷帅耍帅2 小时前
设计模式-桥接模式
设计模式·桥接模式
MinBadGuy3 小时前
【GeekBand】C++设计模式笔记5_Observer_观察者模式
c++·设计模式
刷帅耍帅4 小时前
设计模式-生成器模式/建造者模式Builder
设计模式·建造者模式
蜡笔小新..1 天前
【设计模式】软件设计原则——开闭原则&里氏替换&单一职责
java·设计模式·开闭原则·单一职责原则
性感博主在线瞎搞1 天前
【面向对象】设计模式概念和分类
设计模式·面向对象·中级软件设计师·设计方法
lucifer3111 天前
JavaScript 中的组合模式(十)
javascript·设计模式
lucifer3111 天前
JavaScript 中的装饰器模式(十一)
javascript·设计模式
蜡笔小新..1 天前
【设计模式】软件设计原则——依赖倒置&合成复用
设计模式·依赖倒置原则·合成复用原则