设计模式_命令模式

命令模式

介绍

|-------------------------------------------|----------------------|----------------------------------|--------------------------------------------------------------------------------------------|
| 定义 | 案例 | 问题堆积在哪里 | 解决办法 |
| 行为形设计模式 就是把 "发布命令 执行命令"细化为多个角色 每个角色又能继续细化 | 发布命令 1 打印1-9 a 打印A-G | 如果有更多的命令 命令处理方式更加多样性 更复杂 处理命令的顺序 | 拆分角色:降低耦合度 命令类(一个命令一个类) 具体接收类(具体的处理命令 当前 用静态方法代替) 执行执行 ( 先进先执行 新进后执行 优先等级高的先执行 )可以设置多种优先等级 |

类图

1 . 一个命令接口类

2 "命令接口类" 包含了 "处理类"

3 传给了"调用方" 来定义如何调用

代码

角色1 BaseCommand :抽象命令

角色2.1 Command1 :具体命令1

角色2.2 CommandA :具体命令2

角色3 Receiver:具体命令处理

角色4 Invoke:执行方

BaseCommand

cs 复制代码
public abstract class BaseCommand
{
    // 委托:命令
    public delegate void ExecuteCommand();
    public ExecuteCommand executeCommand = null;

    public BaseCommand(ExecuteCommand executeCommand)
    {
        this.executeCommand += executeCommand;
    }

    // 执行命令
    public abstract void Execute();
}

Command1

cs 复制代码
public class Command1 : BaseCommand
{
    public Command1(ExecuteCommand executeCommand)
       : base(executeCommand)
    {

    }

    public override void Execute()
    {
        if (null != executeCommand)
            executeCommand();
    }
}

CommandA

cs 复制代码
public class CommandA : BaseCommand
{
    public CommandA(ExecuteCommand executeCommand)
        : base(executeCommand)
    {
    }

    public override void Execute()
    {
        if (null != executeCommand)
            executeCommand();
    }
}

Receiver

cs 复制代码
using UnityEngine;

/// <summary>
/// 功能集合
/// </summary>
public class Receiver
{
    static public void Show1to9()
    {
        Debug.Log("打印:123456789!");
    }

    static public void showAtoG()
    {
        Debug.Log("打印:ABCDEFG!");
    }
}

Invoke

cs 复制代码
/// <summary>
/// 调用者 
/// 可以继续扩展:
/// 1 收集命令
/// 2 命令顺序不同 倒序 或者 特殊优先级高的先执行
/// 3 扩展为设计模式深入设计
/// </summary>
public class Invoke
{
    private BaseCommand commend = null;

    Invoke() { }
    public Invoke(BaseCommand commend)
    {
        this.commend = commend;
    }

    public void Execute()
    {
        commend.Execute();
    }
}

运行代码

cs 复制代码
using System;
using UnityEngine;

public class TestML : MonoBehaviour
{
    void Start()
    {
        BaseCommand command = null;
        string strCommand = "1";

        switch (strCommand)
        {
            case "A":
                command = new CommandA(Receiver.showAtoG);
                break;

            case "1":
                command = new Command1(Receiver.Show1to9);
                break;

            default:
                break;
        }

        // 执行命令
        Invoke invoke = new Invoke(command);
        invoke.Execute();
    }

}

运行结果

心得备注

设计模式需要放到框架设计 才更有意义,有时候如果有一个小的需求并且后期也不会改动,直接用流程的方式写代码更加简单,进一步设计反而没必要!

如果放入项目框架, 命令模式的4个角色还能继续细分,细分后再细分,考虑后期的各种变动,根据策划案进一步细分优化,细节处使用更多的设计模式。

一步步优化下去, 推迟细节再推迟。。直到config配置文件或者Execl。

相关推荐
小灰灰搞电子16 分钟前
Qt 实现炫酷锁屏源码分享
开发语言·qt·命令模式
平凡之路无尽路5 小时前
智能体设计模式:构建智能系统的实践指南
人工智能·设计模式·自然语言处理·nlp·aigc·vllm
一只小bit6 小时前
Qt Widget 控件介绍:覆盖常用属性及API
开发语言·c++·qt·命令模式·cpp
冷崖20 小时前
工厂模式-创建型
c++·设计模式
何中应1 天前
【面试题-5】设计模式
java·开发语言·后端·设计模式·面试题
iFlow_AI1 天前
iFlow CLI 实战案例|生产级 Agent 聊天应用——Chatbot
交互·ai编程·命令模式·iflow·iflow cli·iflowcli
沐森1 天前
在实战中运用泛型和动态trait(特质)
设计模式
lomocode1 天前
改一个需求动 23 处代码?你可能踩进了这个坑
后端·设计模式
喷火龙8号1 天前
JWT 认证方案深度对比:单 Token 扩展刷新 vs 双 Token 验证
后端·设计模式·架构
fakerth2 天前
【OpenHarmony】设计模式模块详解
c++·单例模式·设计模式·openharmony