代码乱成一团?这个模式帮你一键整理!

开发
命令模式就像是一位优秀的管家,它帮我们把复杂的操作变得井井有条。虽然实现起来可能会增加一些类的数量,但换来的是更好的可维护性和扩展性。

想象一下,你在使用一个图形用户界面(GUI)应用程序 🖥️,每次点击按钮、选择菜单项或使用快捷键时,都会触发特定的操作。这些操作的背后,其实就是命令模式在发挥作用!今天我们就来聊聊这个优雅的设计模式 🌟

从前从前...的一个头疼故事 🤕

嘿,让我给你讲个有趣的故事!想象一下,你有一个特别固执的小助手 🤖,他总是把所有事情都堆在一起做。就像一个手忙脚乱的章鱼 🐙,同时要煮饭、洗衣服、遛狗、还要接电话!这不就是我们的老式 GUI 系统吗?瞧瞧这个可爱又混乱的小家伙 👇

class GUI {
    void processEvent(string event) {
        if (event == "COPY") {
            // 复制操作 📋
            copy();
        } else if (event == "PASTE") {
            // 粘贴操作 📎
            paste();
        }
        // 哎呀呀,还有好多事要做呢...😱
    }
};

这段代码简直就像是一个装满了各种小玩意的百宝箱 🎁!每次想要加入新功能,就得像收拾杂物间一样,把所有东西都翻出来重新整理 🧹。它就像一个顽皮的小朋友,把所有的玩具都扔进同一个玩具箱,想找什么都要翻箱倒柜 🔍。

更有趣的是,这个小助手还有点"人格分裂" 🤪 —— 它一会儿是按钮管家,一会儿是菜单侍者,一会儿又变身快捷键精灵。就像一个在马戏团里表演的杂技演员 🎪,又要骑独轮车,又要耍杂技,还要变魔术!虽然看起来很厉害,但这样真的好吗?

如果我们的代码是一盘美食 🍱,现在这种做法就像是把所有配料都倒进同一个锅里乱炖 —— 虽然也能吃,但绝对不是米其林的水准!而且最要命的是,当我们想要改变某个功能的时候,就像在玩积木塔 🏗️,抽出一块可能就导致整座塔轰然倒塌!唉,这样的代码可不是我们想要的优雅生活啊~ 🎭✨

让命令模式来拯救我们吧!🎩✨

哎呀,想象一下你是一家超级热闹的米其林餐厅的大老板 👑,每天餐厅里都热闹非凡,叮叮咚咚的订单像小精灵一样飞来飞去 🧚♂️。但是别担心!我们有一位神奇的总管家(就是命令模式啦 🎭),他可是餐厅运转的幕后英雄哦!这位总管家不会自己手忙脚乱地又是端盘子 🍽️ 又是炒菜 🥘,而是像指挥交响乐一样,优雅地挥舞着他的小指挥棒,让每个订单都完美演奏 🎵。

来瞧瞧我们这位魔法总管家的终极秘籍吧 ✨:

// 瞧瞧这个神奇的魔法书 📖
class Command {
public:
    virtual ~Command() = default;
    virtual void execute() = 0;    // 每个魔法都要会施展哦 ✨
};

这个小小的魔法书就像哈利波特的咒语书一样神奇 🪄,它告诉每位魔法师:不管你是变形术大师还是魔药学教授,都要完美地施展自己的魔法!让我们看看这些可爱的魔法师们都会些什么法术 🎪:

// 每位魔法师都有自己的独门绝技 🌟
class GuiCommand : public Command {
    virtual void execute() = 0;
};

// 复制魔法师,挥挥魔杖就能复制万物!
class CopyCommand : public GuiCommand {
    void execute() override {
        std::cout << "叮咚!✨ 复制魔法完成啦 🎊" << std::endl;
    }
};

// 粘贴魔法师,点石成金的本领!
class PasteCommand : public GuiCommand {
    void execute() override {
        std::cout << "哔哔波波!🎵 粘贴魔法生效啦 🎨" << std::endl;
    }
};

哇!这些可爱的小魔法师们就像是霍格沃茨毕业的高材生 🎓,每个都有自己的独门绝技:复制魔法师挥一挥魔杖就能变出一模一样的东西 🪄,粘贴魔法师则能让复制的东西完美地出现在任何地方 🎯。当用户点击按钮的时候,就像在魔法学校的课堂上举手提问一样,我们的总管家立刻就知道该让哪位魔法师出场表演了 🎭。

整个系统就像一场精彩的魔术表演 🎪,每个魔法师都在最恰当的时机登场,完美地展示自己的绝活。就算观众突然要求变个新花样,我们的魔法团队也能从容应对,就像变魔术一样轻松自如呢!🌟 最棒的是,如果我们想要加入新的魔法师,就像在魔法学校招收新学生一样简单,完全不会打扰到其他魔法师的表演哦 🎬!

这样的设计就像是一个充满魔法的音乐盒 🎵,每个齿轮都像施了魔法一样完美啮合,奏出美妙的乐章。而且你永远不用担心魔法书会写不下新的咒语,因为每个魔法师都有自己的专属魔法空间 🌌!

来看看怎么使用这些魔法吧!🎮

想知道我们的魔法系统是如何运作的吗?让我们一起来看看这个神奇的操作台吧!

// 魔法指挥家,就像是马戏团的总指挥 🎪
class CommandInvoker {
private:
    // 这是我们的魔法师花名册,记录着每位魔法师的绝技 📚
    std::map<std::string, std::shared_ptr<Command>> commands;  

public:
    // 在花名册上登记新的魔法师和他的绝技 📝
    void registerCommand(const std::string& name, std::shared_ptr<Command> command) {
        commands[name] = command;  // 欢迎新魔法师加入我们的表演团队!🎭
    }

    // 魔法时刻!让魔法师展示他的才能 ✨
    void executeCommand(const std::string& name) {
        if (commands.find(name) != commands.end()) {
            commands[name]->execute();  // 魔法师,请开始你的表演!🎩
        } else {
            // 糟糕,这个魔法还没有人会施展呢 😅
            std::cout << "哎呀!这个魔法还没有人会呢~ 🤔" << std::endl;
        }
    }
};

// 让我们开始这场精彩的魔法表演吧!🎪
int main() {
    // 请出我们的魔法总指挥 👑
    CommandInvoker invoker;

    // 邀请各位魔法师登台亮相 🌟
    invoker.registerCommand("copy", std::make_shared<CopyCommand>());    // 复制魔法师 📋
    invoker.registerCommand("paste", std::make_shared<PasteCommand>());  // 粘贴魔法师 📎

    // 华丽的开场白 🎭
    std::cout << "欢迎来到魔法表演秀!" << std::endl;
    
    // 让魔法秀开始吧!✨
    invoker.executeCommand("copy");   // 变变变,复制!🪄
    invoker.executeCommand("paste");  // 哔哔啵啵,粘贴!🎯
    invoker.executeCommand("undo");   // 咦?这个魔法还没准备好呢 🤪

    return 0;  // 谢谢观看,魔法表演结束啦!👋
}

看!这就是我们的命令模式魔法系统啦!🌟 它就像一场精彩的魔术表演:

  • 首先,我们有一位魔法指挥家(CommandInvoker)🎭
  • 然后注册了各种会不同魔法的魔法师(CopyCommand、PasteCommand)🧙♂️
  • 当我们需要某个魔法时,只需要告诉指挥家魔法的名字就可以啦!✨ß

这样的设计特别灵活,想要添加新的魔法?只要训练新的魔法师(创建新的Command类)就好啦!而且每个魔法师都专注于自己的魔法,不会互相干扰,多么完美啊!🎯

小结 🎯

命令模式就像是一位优秀的管家,它帮我们把复杂的操作变得井井有条。虽然实现起来可能会增加一些类的数量,但换来的是更好的可维护性和扩展性。在实际开发中,要根据具体场景合理使用,既不能过度设计,也不能忽视它带来的诸多好处。记住,好的设计模式就像好的厨艺,需要恰到好处的火候!🎨 ✨

责任编辑:赵宁宁 来源: everystep
相关推荐

2024-06-17 10:30:38

运维IP地址网络

2009-12-16 09:52:15

Linux操作系统

2022-08-26 09:02:57

代码库编程语言

2020-05-11 09:40:47

IDEA代码神器

2019-07-08 11:25:14

云计算工具Kubernetes

2015-02-09 15:25:52

换肤

2011-07-04 10:08:59

LinuxARM

2012-01-10 15:35:44

金山快盘性能

2022-01-04 10:19:23

架构运维技术

2021-11-30 08:09:52

PostgreSQLPGTune工具数据库

2022-06-21 16:48:37

Python

2024-06-21 10:27:21

Service生成工具鸿蒙

2011-12-29 16:37:21

笔记本评测

2013-02-19 14:35:00

GitHubBoxenPuppet 配置

2015-11-03 15:29:49

ONOS开放网络操作系统SDN

2011-12-21 17:04:53

云计算

2023-06-01 15:30:30

Service代码生成工具

2021-10-19 05:49:15

Windows 11操作系统微软

2023-06-15 10:00:00

Jenkins任务操作

2020-02-13 11:47:05

GitHub代码开发者
点赞
收藏

51CTO技术栈公众号