[学习笔记:设计模式] 18_命令模式

本文介绍了命令模式,包括抽象命令、具体命令、Invoker、Receiver的概念,并以电视遥控器为例,展示了如何通过命令模式发送打开、关闭和切换频道的请求。接收者负责实际操作,调用者则根据需求选择合适的命令执行。
摘要由CSDN通过智能技术生成

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


命令模式包括以下4个对象:

- Command(抽象命令类): 抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute( )等方法,通过这些方法可以调用请求接收者的相关操作。

- ConcreteCommand(具体命令类): 具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。

- Invoker(调用者): 调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。

- Receiver(接收者): 接收者执行与请求相关的操作,它具体实现对请求的业务处理。


举例
用遥控器控制电视的打开、关闭、切换频道

- 抽象命令类

public interface AbstractCommand
    {
        void Execute();
    }

- 具体命令类

//打开电视类
public class TvOpenCommand : AbstractCommand
    {
        //创建接收者对象
        private TvReceiver tv;

        public TvOpenCommand()
        {
            tv = new TvReceiver();
        }

        //收到请求调用接收者的方法
        public void Execute()
        {
            tv.OpenTv();
        }
    }

public class TvCloseCommand : AbstractCommand
    {
        private TvReceiver tv;

        public TvCloseCommand()
        {
            tv = new TvReceiver();
        }

        public void Execute()
        {
            tv.CloseTv();
        }
    }

public class TvChangeCommand : AbstractCommand
    {
        private TvReceiver tv;

        public TvChangeCommand()
        {
            tv = new TvReceiver();
        }

        public void Execute()
        {
            tv.ChangeTv();
        }
    }

- 调用者

public class TvInvoker
    {
        //创建具体命令类对象
        private AbstractCommand openCommand;
        private AbstractCommand closeCommand;
        private AbstractCommand changeCommand;

        public TvInvoker(AbstractCommand openCommand, 
                         AbstractCommand closeCommand,                
                         AbstractCommand changeCommand)
        {
            this.openCommand = openCommand;
            this.closeCommand = closeCommand;
            this.changeCommand = changeCommand;
        }

        //通过不同的方法来调用具体命令类中的方法(发送请求)
        public void Open()
        {
            openCommand.Execute();
        }

        public void Close()
        {
            closeCommand.Execute();
        }

        public void Change()
        {
            changeCommand.Execute();
        }
    }

- 接收者

public class TvReceiver
    {
        //具体实现业务处理
        public void OpenTv()
        {
            Console.WriteLine("打开电视");
        }

        public void CloseTv()
        {
            Console.WriteLine("关闭点视");
        }

        public void ChangeTv()
        {
            Console.WriteLine("切换频道");
        }
    }

- 客户类

class Program
    {
        static void Main(string[] args)
        {
            AbstractCommand openCommand, closeCommand, changeCommand;

            openCommand = new TvOpenCommand();
            closeCommand = new TvCloseCommand();
            changeCommand = new TvChangeCommand();

            TvInvoker tvInvoker = new TvInvoker(openCommand, closeCommand, changeCommand);

            //通过调用者发送请求
            tvInvoker.Open();
            tvInvoker.Close();
            tvInvoker.Change();
        }
    }


总结:抽象命令类中,声明用于执行请求的方法,在具体命令类中,创建一个接收者对象,在执行请求的方法中调用接收者的执行方法,调用者类中创建所有具体命令类对象,根据不同的请求来调用不同具体命令类中的方法,接收者则负责实现所有具体操作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值