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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

本站最新优惠

Namesilo优惠:新用户省 $1 域名注册-优惠码:45D%UYTcxYuCloZ 国外最便宜域名!点击了解更多

特别优惠:免费赠送 $100 Vultr主机-限时优惠!英文站必备海外服务器!点击了解更多

VPS优惠:搬瓦工优惠码:BWH3OGRI2BMW 最高省5.83%打开外面世界的一款主机点击了解更多

原创文章,作者:江小编,如若转载,请注明出处:https://jhrs.com/2018/21756.html

扫码关注【江湖人士】公众号,您会获得关于国外被动收入的最新资讯

WA付费会员QQ群:387027533,加这个群需要回答您的WA会员名,待核实后予以通过

普通QQ交流群:178758794,可分享交流建站的各类经验和知识

发表评论

电子邮件地址不会被公开。 必填项已用*标注

3 × 3 =