范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

设计模式命令模式

  什么是命令模式?:行为参数化的模式
  作用?:降低代码重合度
  1.命令模式介绍
     命令模式 :将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志。以及支持可撤销的操作。
    讲一个模式时,从定义上是不能体会其中的技巧,所以接着我会通过举例子来说明命令模式。
  1.1.举例:
   假设某个公司需要设计一个多用功能的遥控器。基本的需求如下:   该遥控器有可以控制风扇,白炽灯,热水器等等的多对开关,   可能还有其他的电器,暂时不做其功能,但是希望可以保留接口,用的时间可以方便的扩展。   还需要有个按钮,可以撤销上一步的操作。
  1.2. 问题
    由于各种电器的开关方法都不一样,而且还存在一个待扩展的电器,如果没有学习命名模式之前,我们在设置扩展的开关时,会出现的问题是什么呢?假设现在有电视,冰箱还可能会用到遥控器,那么我们会在最后一个开关上写if else,当然如果哪一天又多了一个大门也加入了我们的遥控的行列,这样我们继续加if else ,很显然随着电器的高速发展,会有多个需要遥控可以控制的,从而耦合度会越来越高。
  1.3. 解决问题
    采用命令模式。我们可以先定义好我们的风扇,白炽灯,热水器。然后定义其分别的开关命令,每个命令都有自己对应的电器引用,而且会在命令的Excute中包装电器的开或者关,最后需要把命令安装到遥控器上面,在遥控器上每个按钮都对应有自己的响应方法。说白了,就是将一系列的请求命令封装起来,不直接调用真正执行者的方法,这样比较好扩展。
  2. 命令模式的术语以及其之间关系介绍Command(抽象命令类) :抽象出命令对象,可以根据不同的命令类型。写出不同的实现类   ConcreteCommand(具体命令类) :实现了抽象命令对象的具体实现   Invoker(调用者/请求者): 请求的发送者,它通过命令对象来执行请求。 一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令之间存在关联。在程序运行时,将调用命令对象的execute() ,间接调用接收者的相关操作。  Receiver(接收者):接收者执行与请求相关的操作,真正执行命令的对象。 具体实现对请求的业务处理。未抽象前,实际执行操作内容的对象。  Client(客户端):在客户类中需要创建调用者对象,具体命令类对象,在创建具体命令对象时指定对应的接收者。发送者和接收者之间没有直接关系,都通过命令对象来调用。
  2.1. 本文以白炽灯为例进行分析
  对象1:家里有一个可遥控的白炽灯;
  对象2:遥控器【可以控制白炽灯:ON/OFF】;
  对象3:主人;
  对象
  对应命令模式中的术语
  白炽灯
  Client
  遥控器
  Receiver
  主人
  Invoker
  遥控器以手机屏幕上的 ON  OFF 来代替;
  白炽灯以屏幕的背景颜色白色  黑色 来代替
  主人以使用该手机的人来代替
  2.2. 代码实现
    下面主要看2个核心类:Commond类、CommondManager类,具体的在代码中有详细的注释   class Commond: NSObject {     public typealias CommondCompletionClosure = (_ cmd: Commond) -> Void     var completion: CommondCompletionClosure?      func exexute() {         //override to subclass         self.done()     }      func cancle() {         self.completion = nil     }      func done() {         //异步回到主队列,为了考虑多线程的情况,才采用了这种方式         DispatchQueue.main.async {             if self.completion != nil {                 self.completion!(self)             }             self.completion = nil             CommondManager.share.arrayCoMmmands.remove(at: CommondManager.share.arrayCoMmmands.firstIndex(of: self) ?? 0)         }     } } class CommondManager: NSObject {     var arrayCoMmmands = [Commond?]()     static let share = CommondManager()     public typealias CommondCompletionClosure = (_ cmd: Commond) -> Void     func executeCommand(cmd: Commond?, completion: @escaping CommondCompletionClosure) {         if cmd != nil {             //如果正在执行则不做处理,否则添加并执行命令             if !isExcutingCommond(cmd: cmd) {                 CommondManager.share.arrayCoMmmands.append(cmd)                  cmd?.completion = completion                 //执行命令                 cmd?.exexute()             }         }     }     func cancleCommand(cmd: Commond?) {         if cmd != nil {             CommondManager.share.arrayCoMmmands.remove(at: CommondManager.share.arrayCoMmmands.firstIndex(of: cmd) ?? 0)             cmd?.cancle()         }     }     private func isExcutingCommond(cmd: Commond?) -> Bool {         if cmd != nil {             for Acmd in CommondManager.share.arrayCoMmmands {                 if cmd == Acmd { return true}             }         }         return false     } }
  2.3. 关于撤销操作
    可以直接CommondManager.share.arrayCoMmmands.removeLast()
  或者在Commond类里面加一个rollBack() 方法,
    举例:以LightONCommond 为例,实现rollBack() 方法。   class LightONCommond: Commond {     var lightReceiver: LightReceiver?      override init() {}     convenience init(lightReceiver: LightReceiver) {         self.init()         self.lightReceiver = lightReceiver     }          override func exexute() {         lightReceiver?.LightOn() //"灯开"         CommondManager.share.rollBackCommond = self     }      override func rollBack() { //撤销         lightReceiver?.LightOff()     } }
  3. 总结:
    命令模式主要通过中介Command实现了发出命令者和命令的执行者,也即Invoke类和Receiver的松耦合。本文先给出了命令模式的定义,通过遥控器的例子详细的讲解了命令模式的使用以及实现。最后,也介绍了命令模式撤销操作的实现。

小米平板5官宣啦,你们期待吗期待已久的小米平板,时隔三年,终于要更新了。8月6日消息,小米手机官方宣布,将于8月10日发布小米平板5,和MIX4同场亮相。根据海报来看,小米平板5将会支持手写笔。虽然功能等等方台电M40平板电脑深度体验这款平板不止是全能跑分王随着手机尺寸越做越大,笔记本电脑越做越轻薄,平板电脑似乎已经没有了市场竞争力,但是在很多场景下,如办公演示大屏教学餐饮点餐等,在这些场景中平板电脑扮演者不可或缺的角色。这次非常感谢中国微笑第一股电脑帮你箍牙套,用户真能笑得美?厂家的培训会带来正畸从业医师水平的提高,但专业知识的差距,是无法通过短暂的缺乏系统的培训来弥补的。大数据更是无法提供完美的正畸方案。本文由无冕财经(wumiancaijing)原创一个深色模式的简单CSS技巧让你的网站根据用户选择的主题进行调整的能力是一个很棒的辅助功能。你可能已经熟悉媒体查询mediaquery了。它们被广泛地用于使网站具有响应性。width和height属性包含视区贵州第一座交通输水两用大桥主拱合龙9月26日,由中国水电八局承建的贵州省第一座交通输水两用大桥(西溪河大桥)主拱合龙。西溪河交通输水两用大桥,是贵州凹水河水库库区的交通用桥,也是主输水管道跨越西溪河谷的输水用桥,对7万级智能科技舱,哪吒VPro长续航智趣版长续航智享版精智上市以智取胜,向新而升。11月3日,7万级智能科技舱哪吒VPro精智上市,新车包括长续航智趣版长续航智享版两款车型,补贴后官方售价分别是7。69万元8。09万元。基于年轻消费者有个性敢2021中国国际金融展信创专题展举办,航天龙梦携系列产品重磅亮相近日,2021中国国际金融展信创专题展第二站在沪举办,来自长三角地区近300位金融监管机构金融机构科技企业的领导和代表观展参会,以产品展示技术交流经验分享等方式,共同推动金融信创工印尼北苏三燃煤电站整体投入商业运行8月18日,中国水电八局承建的印尼北苏三燃煤电站获得印尼国家电力公司最终批复全部机组满足要求,项目自2021年7月1日起正式进入商业运行。北苏三电站位于北苏拉威西省比通市,是印尼国森松国际CEO西松江英他人无法模仿,自然不可超越1990年,上海正式宣布开发开放浦东。同年,森松上海在浦东新区成立,作为浦东改革开放后入驻新区的第一家外资企业,森松被各大媒体亲切地称呼为浦字一号。鲜为人知的是,当年这个备受瞩目的广东阳蓄电站上水库下闸蓄水作者凌丛颖向远航摄影凌丛颖7月31日,中国水电八局承建的广东阳江抽水蓄能电站上水库正式下闸蓄水。阳江抽水蓄能电站位于广东省阳春市与电白县交界处的八甲山区,是目前国内核准建设的单机容广东阳蓄电站上水库通过蓄水验收作者凌丛颖来源水电八局7月30日,中国水电八局承建的广东阳江抽水蓄能电站上水库工程通过蓄水验收。根据阳蓄电站工程蓄水验收工作安排,6月5日至8日,上水库工程通过了中国水科院专家组开
为什么买苹果手机或华为手机的人,很少更换出厂自带铃声?为什么买苹果手机或华为手机的人,很少更换出厂自带铃声?其实撞衫是一个很尴尬的事情,但是比撞衫更加尴尬的是当你在一辆火车上,火车经过了一两个小时一会儿一个隧道的旅途,手机没有信号收不最适合大学生的3款手机推荐,20003000预算,外观时尚且性能强劲刚结束了高考,手机市场也迎来了一波购机旺季。虽然很多学生都有购机需求,但是却不太懂得如何挑选手机。如果拥有20003000元的预算,这3款手机非常适合大学生,不仅具有时尚的外观,性因遭司机性侵近百名女性集体起诉Uber侨报网综合讯美国多州近百位女性控告叫车服务公司优步(Uber)旗下的驾驶员涉嫌性侵,最早一起案例发生在2014年,最近一起则是在今年4月30日。纽交所前的无畏女孩铜像面对着Uber原来三星手机的音量键还有这些隐藏功能,你都了解么?哈喽各位北鼻们,你平时使用手机时,对于音量键的理解,是不是只是调节音量大小呢?这样,你真的就out啦!其实,音量键还有很多隐藏的功能,好了,不废话啦!我带着大家来了解它的新玩法吧隐流畅稳定与功能缺一不可!2021国内最好用的安卓系统就数这三个纵观当前手机市场,国内外品牌都涌现出诸多优秀的旗舰手机,而且这些旗舰之间在配置方面的差距可谓是越来越小,体验才会成为激烈竞争中的取胜因素。在众多体验当中,相信系统层面会是消费者十分达发(络达)AB1565AM获红米AirDots3Pro使用,外围简单功能强大红米AirDots3Pro是红米的首款降噪耳机产品,全方位的功能升级搭配全新的外观设计方案,具有非常高的辨识度和优秀的性价比。我爱音频网对这款耳机进行了详细的体验评测和拆解报告报道智能穿戴APP开发方案基本功能互联网以及物联网技术的发展,现在智能APP与智能硬件的配合使用成为智慧生活的一道风景线。如智能手表,智能手环,耳机等等。智能穿戴APP主要为用户提供集所有优点于一的全能产品,为用户英特尔不断降价AMD份额下降芯研所消息,AMD这些年份额在稳步上升,不过在6月份的Steam硬件调查中,首次出现了下降,来到了28。53。据悉,AMD已经连续几个月增长,并在前段时间Steam硬件调查突破了320210616买的小米11ultra电池这部手机到现在用了20多天了吧小米11ultra使用这种超级快充硅氧负极电池新技术为用户提供5000毫安的电池,可以为用户带来很好的手机续航体验发发我的手机电池充电使用感受如图小米小米手机脱离安卓用上win11!移植鸿蒙系统指日可待?前不久微软正式发布了7年磨一剑的全新操作系统windows11,迅速成为人们讨论的焦点。win11除了本身的大量新特性还有焕然一新的界面UI设计,最大的亮点就是内置了一整套完整的安小米11系列开发设计图曝光,网友实话实说,没有辨识度小米11系列作为最新的数字代旗舰机,在发布了很长一段时间之后,最后被曝光出最初的设计图。网民一看,直言幸亏初版被砍了,不然更卖不出去!(最初的手稿)小米11系列这段时间以来的口碑毁