假设想让遥控器控制电灯的开关、电视机的开关和切换,该如何做?

所有的开、关、切换都是遥控器发出的指令,把这些指令统一抽象成一个接口。

    public interface IControl
    {
        void Execute();
    }

把电灯、电视机抽象成类。

    public class Tv
    {
        public void TurnOn()
        {
            Console.WriteLine("电视机打开了");
        }

        public void TurnOff()
        {
            Console.WriteLine("电视机关闭了");
        }

        public void SwitchChannel()
        {
            Console.WriteLine("电视机切换频道");
        }
    }


    public class Light
    {
        public void TunrOn()
        {
            Console.WriteLine("电灯打开了");
        }

        public void TurnOff()
        {
            Console.WriteLine("电灯关闭了");
        }
    }

Tv类的TurnOn(),TurnOff(),SwitchChannel(),Light类的TurnOn(),TurnOff(),这些方法都会通过执行IController的Execute方法被触发。把每一种动作抽象成类,并实现IControl接口。

    public class LighOn : IControl
    {
        private Light _light;

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

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

    public class LightOff : IControl
    {
        private Light _light;

        public LightOff(Light light)
        {
            _light = light;
        }
        public void Execute()
        {
            _light.TurnOff();
        }
    }

    public class TvOn : IControl
    {
        private Tv _tv;

        public TvOn(Tv tv)
        {
            _tv = tv;
        }

        public void Execute()
        {
            _tv.TurnOn();
        }
    }

    public class TvOff : IControl
    {
        private Tv _tv;

        public TvOff(Tv tv)
        {
            _tv = tv;
        }

        public void Execute()
        {
            _tv.TurnOff();
        }
    }

    public class TvSwitch : IControl
    {
        private Tv _tv;

        public TvSwitch(Tv tv)
        {
            _tv = tv;
        }

        public void Execute()
        {
            _tv.SwitchChannel();
        }
    }


现在,电视机和电灯有了,触发各种动作的类有了,遥控器该装下这些指令(提供装下指令的方法)并提供方法供客户端调用。

    public class RemoteControl
    {
        private IList<IControl> onCommands = new List<IControl>();
        private IList<IControl> offCommands = new List<IControl>();
        private IList<IControl> switchCommands = new List<IControl>();

        public void AddOnCommand(IControl control)
        {
            onCommands.Add(control);
        }

        public void AddOffCommand(IControl control)
        {
            offCommands.Add(control);
        }

        public void AddSwitchCommand(IControl control)
        {
            switchCommands.Add(control);
        }

        public void PressOnButton(int number)
        {
            onCommands[number].Execute();
        }

        public void PressOffButton(int number)
        {
            offCommands[number].Execute();
        }

        public void PressSwitchButton(int number)
        {
            switchCommands[number].Execute();
        }
    }


客户端的执行逻辑大致是:把电视机、电灯准备好,把各种指令准备好,拿出遥控器把各种指令收纳其中,最后调用遥控器的方法执行各种指令。

    class Program
    {
        static void Main(string[] args)
        {
            //命令的接收方
            Light light = new Light();
            Tv tv = new Tv();

            //各种命令
            LighOn turnLightOn = new LighOn(light);
            LightOff turnLightOff = new LightOff(light);

            TvOn turnTvOn = new TvOn(tv);
            TvOff turnTvOff = new TvOff(tv);
            TvSwitch switchTv = new TvSwitch(tv);

            //RemoteConroller组装命令
            RemoteControl control = new RemoteControl();
            control.AddOnCommand(turnLightOn);
            control.AddOnCommand(turnTvOn);

            control.AddOffCommand(turnLightOff);
            control.AddOffCommand(turnTvOff);

            control.AddSwitchCommand(switchTv);

            control.PressOnButton(0);
            Console.ReadKey();

        }
    }


总结:命令模式的需求源自想通过一个指令(比如这里IControl的Execute方法)来控制多个类的多个方法,包含了几个要素:
1、命令:让类的各种方法抽象成类实现一个接口
2、装配命令:把各种命令放到一个集合中
3、触发命令:提供方法调用命令集合中的某条命令,让其执行指令

用最简单的例子理解命令模式(Command Pattern)的更多相关文章

  1. 用最简单的例子理解备忘录模式(Memento Pattern)

    简单来说,备忘录模式就是支持回退操作.假设让一个Notepad支持回退操作,如何实现呢? 首先需要一个备忘录类. public class Memento { private string _msg; ...

  2. 用最简单的例子理解复合模式(Composite Pattern)

    在显示树形结构时,复合模式有很好的体现.本篇显示如下部门结构: 以上,有的节点包含子节点,有的节点部包含子节点.不管是什么节点,每个节点就代表一个部门. 首先设计一个关于部门的抽象基类. public ...

  3. 用最简单的例子理解迭代器模式(Iterator Pattern)

    迭代器模式的需求来自:需要对一些集合进行迭代,而迭代的方式可能有很多种. 说到迭代,动作大致包括设置第一个位置,获取下一个位置元素,判断是否迭代结束,获取当前位置元素,大致就这么些.把这些迭代动作封装 ...

  4. 设计模式 - 命令模式(command pattern) 具体解释

    命令模式(command pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 命令模式(command pattern) : 将请求封装成对 ...

  5. 设计模式 - 命令模式(command pattern) 多命令 具体解释

    命令模式(command pattern) 多命令 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.csdn.ne ...

  6. 设计模式 - 命令模式(command pattern) 宏命令(macro command) 具体解释

    命令模式(command pattern) 宏命令(macro command) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考: 命名模式(撤销) ...

  7. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  8. 设计模式 - 命令模式(command pattern) 撤销(undo) 具体解释

    命令模式(command pattern) 撤销(undo) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考命令模式: http://blog.cs ...

  9. 二十四种设计模式:命令模式(Command Pattern)

    命令模式(Command Pattern) 介绍将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可取消的操作. 示例有一个Message实体类,某个 ...

随机推荐

  1. Oracle学习笔记:decode函数

    decode函数主要作用:将查询结果翻译成其他值(即以其他形式变现出来) 使用方法: SELECT DECODE(colunm_name,值1,翻译值1,值2,翻译值2……值n,翻译值n,缺省值) F ...

  2. 20165203 实验二 Java面向对象程序设计

    20165203 实验二 Java面向对象程序设计 一.面向对象程序设计1--单元测试和TDD 1.实验要求 参考 (http://www.cnblogs.com/rocedu/p/6371315.h ...

  3. Python *args **kw

    当函数的参数不确定时,可以使用*args 和**kwargs,*args 没有key值,**kwargs有key值. *args def fun_var_args(farg, *args): prin ...

  4. python中round(四舍五入)的坑

    python中的round函数不能直接拿来四舍五入,一种替代方式是使用Decimal.quantize()函数. 具体内容待补. >>> round(2.675, 2) 2.67 可 ...

  5. 好久没有写过SQL了,今天写了一句select in留存

    应同事要求,直接去接数据库的数据. 数据C里有一个name是查询的起始. 然后,B其实是一个多对多的中间表, 通过B查出id之后, 就可以在A里找到需要的数据了. select name from A ...

  6. bzoj 1295 1295: [SCOI2009]最长距离

    思路:对于每个点出发bfs做一次dp, dp[ i ][ j ][ k ] 表示从枚举的该点能不能经过k个障碍物到达(i , j). #include<bits/stdc++.h> #de ...

  7. Django实战(16):Django+jquery

    现在我们有了一个使用json格式的RESTful API,可以实现这样的功能了:为了避免在产品列表和购物车之间来回切换,需要在产品列表界面显示购物车,并且通过ajax的方式不刷新界面就更新购物车的显示 ...

  8. Ionic Js七:手势事件

    1.on-hold 长按的时间是500毫秒. HTML 代码 <button on-hold="onHold()" class="button">长 ...

  9. Jersey入门二:运行项目

    1.项目有了,在终端窗口进入项目的根目录(即 \simple-service ) 2.现在先测试运行下: mvn clean test  项目将会被编译,并且进行单元测试  上面可以看看到测试通过 ...

  10. java字符串解析

    java的虚拟机在内存中开辟出一块单独的区域,用来存储字符串对象,这款内存区域被称为字符串缓冲池. //创建字符串的时候先查找字符串缓冲池中没相同的对象,如果相同的对象就直接返回改对象的引用 //如果 ...