大话设计模式:命令模式

一、什么是命令略模式
请求对象化,,以便可记录可撤销

将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
将请求包装进命令中,并传给调用对象,调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

UML图

在这里插入图片描述
Receiver接收器类,里面包含执行方法,等待命令类调用.
Command:命令类,有一个执行方法
ConcreteCommand:具体执行类依赖接收器,统一执行操作 接收器里面声明的方法.
Invoker: 请求者类,发布命令,记录命令,可执行,撤销命令,对命令做统筹管理

二、适用场景

需要发布指令,亦可撤销指令的情况,比如餐饮下单,比如 遥控器换台, 开关电灯.命令模式最.

三、优缺点

优点
解耦合,将命令的声明与执行分开,调用者与接收者解耦合.
请求内容可操作性强,可记录,增加,撤销等
命令模块可以方便扩展
很容易设计一个命令队列
接收方可以判断是否接受命令

缺点
命令模式Command的子类会以命令的个数而存在,可能会非常庞大。

四、大话中的例子

烧烤店,顾客下单点烤羊肉串,烤鸡翅的命令,请求类需要将这些命令几率下来,然后可执行,将命令发送给执行者。执行者类有烤肉,烤鸡翅,烤鸡腿等方法,命令类有一个执行方法,具体命令类,依赖执行者类,自身的操作方法其实是调用执行者类对应的方法。接收者类接受不同的命令,下达执行命令。

五、我的例子
using System;

namespace CommandMode
{
    class Program
    {
        static void Main(string[] args)
        {

            Nnjutsu nnjutsu = new Nnjutsu();
            Mudras mudras = new Mudras(new Command[] { new Chou(nnjutsu), new Xu(nnjutsu), new Chen(nnjutsu), new Zi(nnjutsu), new Xu(nnjutsu), new Hai(nnjutsu), new Si(nnjutsu), new Yin(nnjutsu), new JieYin(nnjutsu) });
            mudras.Action();
             mudras = new Mudras(new Command[] { new Wei(nnjutsu), new Si(nnjutsu), new Yin(nnjutsu), new JieYin(nnjutsu) });
            mudras.Action();
          
        }
    }

    class Nnjutsu
    {
        string mudras;

        public void ShadowCopy()
        {
            if (mudras == "丑戌辰子戌亥巳寅")
            {
                Console.WriteLine("影分身之术");
            }
            else if (mudras == "未巳寅")
            {
                Console.WriteLine("身之术");

            }
            else if (mudras == "亥戌酉申未")
            {
                Console.WriteLine("通灵术");

            }
            mudras = "";
        }

        public void CreateMudras(string mudra)
        {
            mudras += mudra;
        }
    }

    class Mudras
    {
        Command[] commands;
        public Mudras(params Command[] commands)
        {
            this.commands = commands;
        }

        public void Action()
        {
            foreach (var item in commands)
            {
                item.Excute();
            }
        }
    }

    abstract class Command
    {

        protected Nnjutsu nnjutsu;
        public Command(Nnjutsu nnjutsu)
        {
            this.nnjutsu = nnjutsu;
        }
        public abstract string Excute();

    }

    class Zi : Command
    {
        public Zi(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("子");
            return "子";
        }
    }

    class Chou : Command
    {
        public Chou(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("丑");
            return "丑";
        }
    }

    class Yin : Command
    {
        public Yin(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("寅");

            return "寅";
        }
    }
    class Mao : Command
    {
        public Mao(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("卯");
            return "卯";
        }
    }

    class Chen : Command
    {
        public Chen(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("辰");

            return "辰";
        }
    }
    class Si : Command
    {
        public Si(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("巳");
            return "巳";
        }
    }

    class Wu : Command
    {
        public Wu(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.CreateMudras("午");
            return "午";
        }
    }
    class Wei : Command
    {
        public Wei(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }



        public override string Excute()
        {
            nnjutsu.CreateMudras("未");
            return "未";
        }
    }
    class Shen : Command
    {
        public Shen(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }


        public override string Excute()
        {
            nnjutsu.CreateMudras("申");
            return "申";
        }
    }
    class You : Command
    {
        public You(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }



        public override string Excute()
        {
            nnjutsu.CreateMudras("酉");
            return "酉";
        }
    }
    class Xu : Command
    {
        public Xu(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }


        public override string Excute()
        {
            nnjutsu.CreateMudras("戌");
            return "戌";
        }
    }
    class Hai : Command
    {
        public Hai(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }



        public override string Excute()
        {
            nnjutsu.CreateMudras("亥");
            return "亥";
        }
    }

    class JieYin : Command
    {
        public JieYin(Nnjutsu nnjutsu) : base(nnjutsu)
        {
        }

        public override string Excute()
        {
            nnjutsu.ShadowCopy();
            return "";
        }
    }

  
}

运行结果

在这里插入图片描述
PS:命令模式,命令过多不宜使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值