C# 设计模式-命令模式

命令模式:将每一个方法都封装成一种命令,调用只需要调用固定的接口就可以,而不需要调用原来的方法。

先定义实体类

    public class Light
    {
        public Light(string name)
        {
            Name = name;
        }

        string Name { get; set; }

        public void On()
        {
            Console.WriteLine(Name + " Light On");
        }

        public void Off()
        {
            Console.WriteLine(Name + " Light Off");
        }
    }

    public class Radio
    {
        private readonly string _name;
        private readonly string _type;
        private readonly int _volume;

        public Radio(string name, string type, int volume)
        {
            _name = name;
            _type = type;
            _volume = volume;
        }

        public void On()
        {
            Console.WriteLine(_name + " Radio On");
        }

        public void Off()
        {
            Console.WriteLine(_name + " Radio Off");
        }

        public void Type()
        {
            Console.WriteLine(_name + " Radio Type " + _type);
        }

        public void Volume()
        {
            Console.WriteLine(_name + " Radio Volume " + _volume);
        }
    }

再定义一个命令接口

    public interface ICommand
    {
        //执行命令
        void Execute();
        //撤销命令
        void Undo();
    }

将实体类的每一个方法都变成一种命令

    public class LightOnCommand : ICommand
    {
        private readonly Light _light;

        public LightOnCommand(Light light)
        {
            _light = light;
        }

        public void Execute()
        {
            _light.On();
        }

        public void Undo()
        {
            _light.Off();
        }
    }

    public class LightOffCommand : ICommand
    {
        private readonly Light _light;

        public LightOffCommand(Light light)
        {
            _light = light;
        }

        public void Execute()
        {
            _light.Off();
        }

        public void Undo()
        {
            _light.On();
        }
    }

    public class RadioOnCommand : ICommand
    {
        private readonly Radio _radio;

        public RadioOnCommand(Radio radio)
        {
            _radio = radio;
        }

        public void Execute()
        {
            _radio.On();
            _radio.Type();
            _radio.Volume();
        }

        public void Undo()
        {
            _radio.Off();
        }
    }

    public class RadioOffCommand : ICommand
    {
        private readonly Radio _radio;

        public RadioOffCommand(Radio radio)
        {
            _radio = radio;
        }

        public void Execute()
        {
            _radio.Off();
        }

        public void Undo()
        {
            _radio.On();
            _radio.Type();
            _radio.Volume();
        }
    }

定义一个控制器。改控制器维护了一个OnCommand List和OffCommand List,分别用来存储不同实体的On和Off命令。需要先将命令设置到控制器存储,随后再使用

    public class RemoteControl
    {
        public RemoteControl(int index)
        {
            _onCommand = new List<ICommand>();
            _offCommand = new List<ICommand>();
            NoCommand noCommand = new NoCommand();
            for (int i = 0; i < index; i++)
            {
                _onCommand.Add(noCommand);
                _offCommand.Add(noCommand);
            }

            _undoCommand = noCommand;
        }

        private List<ICommand> _onCommand;
        private List<ICommand> _offCommand;
        private ICommand _undoCommand;

        public void SetCommand(int index, ICommand onCommand, ICommand offCommand)
        {
            _onCommand[index] = onCommand;
            _offCommand[index] = offCommand;
        }

        public void OnExecute(int index)
        {
            _onCommand[index].Execute();
            _undoCommand = _onCommand[index];
        }

        public void OffExecute(int index)
        {
            _offCommand[index].Execute();
            _undoCommand = _offCommand[index];
        }

        public void Undo()
        {
            _undoCommand.Undo();
        }
    }

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值