您的位置:首页 > 其它

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

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

复功能

优 点:

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

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

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

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

概述

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

先来看看这个定义的类图实现:Command表示命令的抽象类,而ConcreteCommand则表示具体命令,而Invoke则是接收命令,并执行命令的地方,并且命令在这个地方我们都是知道这个命令的。


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



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



Public MustInherit Class Command
Protected m_codegroup As CodeGroup = New CodeGroup()
Protected m_PageGroup As PageGroup = New PageGroup()
Protected m_RequirementGroup As RequirementGroup = New RequirementGroup()
Public MustOverride Sub execute()
End Class ' Command
Public Class AddRequirementCommand
Inherits Command
Public Overrides Sub execute()
MyBase.m_RequirementGroup.find()
MyBase.m_RequirementGroup.add()
End Sub
End Class ' AddRequirementCommand
Public Class DeletePageCommand
Inherits Command
Public Overrides Sub execute()
MyBase.m_PageGroup.find()
MyBase.m_PageGroup.delete()
End Sub
End Class ' DeletePageCommand
Public MustInherit Class Group
Public MustOverride Sub find()
Public MustOverride Sub add()
Public MustOverride Sub delete()
Public MustOverride Sub change()
Public MustOverride Sub plan()
End Class ' Group
Public Class CodeGroup
Inherits Group
Public Overrides Sub find()
Console.WriteLine("找到代码组")
End Sub
Public Overrides Sub add()
Console.WriteLine("客户要求增加代码")
End Sub
Public Overrides Sub delete()
Console.WriteLine("客户要求删除代码")
End Sub
Public Overrides Sub change()
End Sub
Public Overrides Sub plan()
Console.WriteLine("客户要求改变代码")
End Sub
End Class ' CodeGroup
Public Class PageGroup
Inherits Group
Public Overrides Sub find()
Console.WriteLine("找到美工组")
End Sub
Public Overrides Sub add()
Console.WriteLine("添加页面")
End Sub
Public Overrides Sub delete()
Console.WriteLine("删除页面")
End Sub
Public Overrides Sub change()
End Sub
Public Overrides Sub plan()
Console.WriteLine("客户要求页面改变计划.....")
End Sub
End Class ' PageGroup
Public Class RequirementGroup
Inherits Group
Public Overrides Sub find()
Console.WriteLine("找到需求组")
End Sub
Public Overrides Sub add()
Console.WriteLine("添加需求")
End Sub
Public Overrides Sub delete()
Console.WriteLine("删除需求")
End Sub
Public Overrides Sub change()
End Sub
Public Overrides Sub plan()
Console.WriteLine("客户要求需求改变计划")
End Sub
End Class ' RequirementGroup
Public Class Invoke
Private m_command As Command
'''
''' <param name="_command"></param>
Public Sub setCommand(ByVal _command As Command)
m_command = _command
End Sub
Public Sub Action()
m_command.execute()
End Sub
End Class ' Invoke
Module Client
Sub Main()
Dim _delPageCommand As DeletePageCommand = New DeletePageCommand
Dim _invoke As Invoke = New Invoke()
_invoke.setCommand(_delPageCommand)
_invoke.Action()
Console.Read()
End Sub
End Module
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: