设计模式利剑9-命令模式

 

定    义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢

             复功能

优    点:

           1、类间解耦,调用者角色与接受者角色之间没有任何依赖关系,调用者实现功能时只需调用command抽象类的execute方法即可,

                不用管是具体哪个接受者执行

           2、可扩展性,command可以随意扩展

缺    点:如果命令太多,会导致Invoke比较大

概述

     在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合[李建忠]。这就是本文要说的Command模式。

      先来看看这个定义的类图实现:Command表示命令的抽象类,而ConcreteCommand则表示具体命令,而Invoke则是接收命令,并执行命令的地方,并且命令在这个地方我们都是知道这个命令的。image       首先来看一个项目开发的实例,项目小组由需求小组,有美工小组,有编码小组,并且有项目负责人,在一个公司进行软件开发,软件需求是不断的变动的,这个公司为了避免自己要一个一个的去告诉美工我要修改界面,告诉编码小组什么地方要有修改,这个时候,需求公司与项目经理定义一套命令规则,我有需求只要直接告诉项目经理,而项目经理根据需求公司的需求来下达命令给各个分公司,这样,双方都得到了解脱,这些命令本来是类之间传递的一个方法,现在将其抽象出来,作为一个类来处理,简化了整个流程。先来看设计好的UML图如下所示:

image        有了以上设计以后,命令书面化,一切都有效率起来了。再来看看文档管理中的删除,添加,恢复文档功能,这些都是用户对文档发出的命令,为了确保客户的简化,不需要他制定是谁来处理这件事情,那么有如下设计:

image

 

  1. Public MustInherit Class Command  
  2.     Protected m_codegroup As CodeGroup = New CodeGroup()  
  3.     Protected m_PageGroup As PageGroup = New PageGroup()  
  4.     Protected m_RequirementGroup As RequirementGroup = New RequirementGroup()  
  5.     Public MustOverride Sub execute()  
  6. End Class ' Command   
  7. Public Class AddRequirementCommand  
  8.     Inherits Command  
  9.     Public Overrides Sub execute()  
  10.         MyBase.m_RequirementGroup.find()  
  11.         MyBase.m_RequirementGroup.add()  
  12.     End Sub  
  13. End Class ' AddRequirementCommand   
  14. Public Class DeletePageCommand  
  15.     Inherits Command  
  16.     Public Overrides Sub execute()  
  17.         MyBase.m_PageGroup.find()  
  18.         MyBase.m_PageGroup.delete()  
  19.     End Sub  
  20. End Class ' DeletePageCommand   
  21. Public MustInherit Class Group  
  22.     Public MustOverride Sub find()  
  23.     Public MustOverride Sub add()  
  24.     Public MustOverride Sub delete()  
  25.     Public MustOverride Sub change()  
  26.     Public MustOverride Sub plan()  
  27. End Class ' Group   
  28. Public Class CodeGroup  
  29.     Inherits Group  
  30.     Public Overrides Sub find()  
  31.         Console.WriteLine("找到代码组")  
  32.     End Sub  
  33.     Public Overrides Sub add()  
  34.         Console.WriteLine("客户要求增加代码")  
  35.     End Sub  
  36.     Public Overrides Sub delete()  
  37.         Console.WriteLine("客户要求删除代码")  
  38.     End Sub  
  39.     Public Overrides Sub change()  
  40.     End Sub  
  41.     Public Overrides Sub plan()  
  42.         Console.WriteLine("客户要求改变代码")  
  43.     End Sub  
  44. End Class ' CodeGroup   
  45. Public Class PageGroup  
  46.     Inherits Group  
  47.     Public Overrides Sub find()  
  48.         Console.WriteLine("找到美工组")  
  49.     End Sub  
  50.     Public Overrides Sub add()  
  51.         Console.WriteLine("添加页面")  
  52.     End Sub  
  53.     Public Overrides Sub delete()  
  54.         Console.WriteLine("删除页面")  
  55.     End Sub  
  56.     Public Overrides Sub change()  
  57.     End Sub  
  58.     Public Overrides Sub plan()  
  59.         Console.WriteLine("客户要求页面改变计划.....")  
  60.     End Sub  
  61. End Class ' PageGroup   
  62. Public Class RequirementGroup  
  63.     Inherits Group  
  64.     Public Overrides Sub find()  
  65.         Console.WriteLine("找到需求组")  
  66.     End Sub  
  67.     Public Overrides Sub add()  
  68.         Console.WriteLine("添加需求")  
  69.     End Sub  
  70.     Public Overrides Sub delete()  
  71.         Console.WriteLine("删除需求")  
  72.     End Sub  
  73.     Public Overrides Sub change()  
  74.     End Sub  
  75.     Public Overrides Sub plan()  
  76.         Console.WriteLine("客户要求需求改变计划")  
  77.     End Sub  
  78. End Class ' RequirementGroup   
  79. Public Class Invoke  
  80.     Private m_command As Command  
  81.     '''    
  82.     ''' <param name="_command"></param>   
  83.     Public Sub setCommand(ByVal _command As Command)  
  84.         m_command = _command  
  85.     End Sub  
  86.     Public Sub Action()  
  87.         m_command.execute()  
  88.     End Sub  
  89. End Class ' Invoke   
  90. Module Client  
  91.     Sub Main()  
  92.         Dim _delPageCommand As DeletePageCommand = New DeletePageCommand  
  93.         Dim _invoke As Invoke = New Invoke()  
  94.         _invoke.setCommand(_delPageCommand)  
  95.         _invoke.Action()  
  96.         Console.Read()  
  97.     End Sub  
  98. End Module  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值