C#设计模式:命令模式(Command Pattern)

一,什么是命令模式(Command Pattern)?

命令模式:将请求封装成命令对象,请求的具体执行由命令接收者执行;

二,如下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _14.命令模式
{
    //命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
    //在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    /// <summary>
    /// 客户端是命令发起方
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Event u = new SleepEvent(new JanReceiver());
            Event j = new EatEvent(new JanReceiver());
            Chinese ch = new Chinese();
            ch.AddEvent(u);
            ch.AddEvent(j);
            ch.ExecuteEvent();
        }
    }

    /// <summary>
    /// 中国人接收到命令,负责调用
    /// </summary>
    public class Chinese
    {
        private List<Event> list = new List<Event>();

        public void AddEvent(Event en)
        {
            list.Add(en);
        }

        public void ExecuteEvent()
        {
            Console.WriteLine("快去吃饭和睡觉");
            foreach (var item in list)
            {
                item.Execute();
            }
        }
    }
    
    /// <summary>
    /// 将命令事件抽象
    /// </summary>
    public abstract class Event
    {
        public abstract void Execute();
    }
    /// <summary>
    ///  执行实际的命令处理的对象
    /// </summary>
    public class SleepEvent : Event
    {
        private JanReceiver _janEvent { get; set; }
        public SleepEvent(JanReceiver relation)
        {
            this._janEvent = relation;
        }
        public override void Execute()
        {
            this._janEvent.SleepEvent(); //在这里选择可以对Sleep行为,进行记录、撤销或重做、事务等处理该命令
        }
    }
    /// <summary>
    /// 执行实际的命令处理的对象
    /// </summary>
    public class EatEvent : Event
    {
        private JanReceiver _JanEvent { get; set; }
        public EatEvent(JanReceiver relation)
        {
            this._JanEvent = relation;
        }
        public override void Execute()
        {
            this._JanEvent.EatEvent();   //在这里选择可以对Eat行为,进行记录、撤销或重做、事务等处理该命令
        }
    }

    public class JanReceiver 
    {
        public void EatEvent()
        {
            Console.WriteLine("日本人吃饭");
        }
        public void SleepEvent()
        {
            Console.WriteLine("日本人睡觉");
        }
    }
}

 三,根据命令模式我们分为下面几个角色,

抽象命令 :Event

具体命令:EatEvent,SayEvent

命令接收者:执行命令(JanReceiver)

命令调用者:(Chinese)

客户端:发送命令

四,在命令模式中,我们将客户端发送的指令封装成一个对象,如我们的吃和睡觉指令,我们将这两个行为以命令的形式包裹在一个对象中,然后传递给命令接受者执行命令,而这里调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Chinese抽象类的execute方法就可以,实现命令的调用

转载于:https://www.cnblogs.com/May-day/p/8875786.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值