站点图标 江湖人士

使用C (NET Core) 实现命令设计模式

使用C (NET Core) 实现命令设计模式

有如许一个可编程的新型遥控器, 它有7个可编程插槽, 每个插槽可毗连分歧的家用电器设备. 每个插槽对应两个按钮: 开, 关(ON, OFF). 此外还有一个全局的打消按钮(UNDO).

此刻客户想利用这个遥控器来节制分歧厂家的家用电器, 例如电灯, 热水器, 电扇, 声响等等.

客户提出让我编写一个接口, 能够让这个遥控器节制插在插槽上的一个或一组设备.

问题来了, 这些家用电器并没有配合的尺度….几乎各自都有本人的一套节制方式.. 并且当前还要添加良多种家用电器.

起首要考虑 分手关心点(Separation of concerns),遥控器该当能够注释按钮动作并能够发送请求, 可是它不应当领会家用电器和若何开关家用电器等.

可是目前遥控器只能做开关功能, 那么怎样让它去节制电灯或者声响呢? 我们不想让遥控器晓得这些具体的家用电器, 更不想写出下面的代码:

号令模式答应你把动作的请求者和动作的现实施行者解耦.这里, 动作的请求者就是遥控器, 而施行动作的对象就是某个家用电器.

这就需要引进号令对象(command object)了. 号令对象会封装在某个对象上(例如卧室的灯)施行某个动作的请求(例如开灯). 所以, 若是我们为每一个按钮都预备一个号令对象, 那么当按钮被按下的时候, 我们就会挪用这个号令对象去施行某些动作. 遥控器本身并不晓得具体施行的动作是什么, 它只是有一个号令对象, 这个号令对象晓得去对哪些电器去做什么样的操作. 就如许, 遥控器和电灯解耦了.

客户给办事员订单, 办事员把订单放到柜台并说: 有新订单了, 然后厨师按照订单预备饭菜.

订单里封装了做饭菜的请求. 能够把订单想象成一个对象, 这个对象就像是对做饭这个动作的请求. 而且它能够来回传送. 订单实现了一个只要orderUp()方式的接口, 这个方式里面封装了做饭的操作流程. 订单同时对动作实施者的援用(厨师). 由于都封装了, 所以办事员不晓得订单里面有啥也不晓得厨师是谁. 办事员只传送订单, 并挪用orderUp().

所以, 办事员的工作就是传送订单而且挪用orderUp(). 办事员的取订单takeOrder()方式会传进来分歧的参数(分歧客户的分歧订单), 可是这不是问题, 由于她晓得所有的订单都支撑orderUp()方式.

厨师晓得若何把饭做好. 一旦办事员挪用了orderUp(), 厨师就接管了整个工作把饭菜做好. 可是办事员和厨师是解耦的: 办事员只要订单, 订单里封装着饭菜, 办事员只是挪用订单上的一个方式罢了. 同样的, 厨师只是从订单上收到指令, 他从来不和办事员间接接触.

客户Client建立了一个号令(Command)对象. 相当于客人拿起了一个订单(点菜)预备起头点菜, 我在揣摩遥控器的槽需要插哪些家用电器. 号令对象和领受者是绑定在一路的. 相当于菜单和厨师, 遥控器的插槽和方针家用电器.

号令对象只要一个方式execute(), 里面封装了挪用领受者现实节制操作的动作. 相当于饭馆订单的orderUp().

客户挪用setCommand()方式. 相当于客户想好点什么菜了, 就写在订单上面了. 我也想好遥控器要节制哪些家电了, 列好清单了.

挪用者拿着曾经setCommand的号令对象, 在将来某个时间点挪用号令对象上面的execute()方式. 相当于办事员拿起订单走到柜台前, 大呼一声: 有订单来了, 起头做菜吧. 相当于我把遥控器和设备的接口毗连上了, 预备起头节制.

最初领受者施行动作. 相当于厨师做饭. 家用电器利用本人独有的节制方式前进履作.

号令模式把请求封装成一个对象, 从而能够利用分歧的请求对其它对象进行参数化, 对请求列队, 记实请求的汗青, 并支撑打消操作.

这里面有一个NoCommand, 它是一个空的类, 只是为了初始化command 以便当前不消判断能否为null.

根基是OK的, 可是有点小问题, 声响的开关形态却是打消了, 可是它的音量(也包罗播放介质, 不外这个我就不去实现了)并没有恢复.

如许我们就能够把计较量限制到固定的线程数上面了. 工作队列和唱工作的对象也是解耦的.

这个例子就是利用号令模式记实请求动作的汗青, 若是出问题了, 能够按照这个汗青进行恢复.

退出移动版