命令模式



//命令模式
定义:
 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
 命令模式的优点:

1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.

2. 命令模式满足"开-闭"原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令

3.由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.

4.使用命令模式可以对请求者的"请求"进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令


优点2:
  首先,命令模式的封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。比如有一组文件操作的命令:新建文件、复制文件、删除文件。如果把这三个操作都封装成一个命令类,客户端只需要知道有这三个命令类即可,至于命令类中封装好的逻辑,客户端则无需知道。

        其次,命令模式的扩展性很好,在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令类则通过对这些基本的操作进行二次封装,当增加新命令的时候,对命令类的编写一般不是从零开始的,有大量的接收者类可供调用,也有大量的命令类可供调用,代码的复用性很好。比如,文件的操作中,我们需要增加一个剪切文件的命令,则只需要把复制文件和删除文件这两个命令组合一下就行了,非常方便。

缺点:      
    最后说一下命令模式的缺点,那就是命令如果很多,开发起来就要头疼了。特别是很多简单的命令,实现起来就几行代码的事,而使用命令模式的话,不用管命令多简单,都需要写一个命令类来封装。
(推荐链接:http://blog.youkuaiyun.com/zhengzhb/article/details/7550895
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;
using System.Configuration;
namespace yjzcjing
{
    public class Barbecuer//烤肉串的人
    {
        public void BakeMutton()
        {
            Console.WriteLine("烤羊肉串!");
        }
        public void BakeChickenWing()
        {
            Console.WriteLine("烤鸡翅!");
        }
    }
    public abstract class Command//命令抽象类
    {
        protected Barbecuer receiver;
        public Command(Barbecuer receiver)//接受命令给烤肉的人
        {
            this.receiver = receiver;
        }
        abstract public void ExcuteCommand();//烤肉人执行命令
    }
    class BakeMuttonCommand : Command//烤羊肉串命令
    {
        public BakeMuttonCommand(Barbecuer receiver) : base(receiver)
        {

        }
        public override void ExcuteCommand()//执行烤羊肉串
        {
            receiver.BakeMutton();
        }

    }
    class BakeChickenWingCommand : Command//烤鸡翅命令
    {
        public BakeChickenWingCommand(Barbecuer receiver):base(receiver)
        {

        }
        public override void ExcuteCommand()//执行烤鸡翅命令
        {
            receiver.BakeChickenWing();
        }
    }
    public class Waiter//服务员,记录命令
    {
        private Command command;
        public void setOrder(Command command)//接受命令
        {
            this.command = command;
        }
        public void Notify()//发出命令让其执行
        {
            command.ExcuteCommand();
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Barbecuer boy = new Barbecuer();//烤肉师傅
            Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);//烤羊肉串
            Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);//烤鸡翅
            Waiter girl = new Waiter();//创建服务员对象
            girl.setOrder(bakeMuttonCommand1);//接受命令,进行记录
            girl.Notify();//让其执行
            girl.setOrder(bakeMuttonCommand2);
            girl.Notify();
            Console.Read();
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值