Command模式和Strategy模式有何区别

2025-03-11 04:35:10
推荐回答(3个)
回答1:

区别:
1、command对象要收集两类信息,一个是方法名称,另一个是方法参数,通过对象Receiver 来收集参数。
Command模式的基本动机是解耦程序动作的发起与实际执行,这就象战场上班长下达命令(Command):机枪掩护(Comnand对象1),步兵冲锋(Command对象2),但实际机枪怎么打,每个步兵怎么冲则属于执行的事,并非都由班长计划好的。不同的兵将会有不同的冲锋路径,这叫“多态”。Command模式的解耦机制一可实现多态,二可实现异步(动作发起并不意味着马上执行)。

2、strategy不需要收集方法名称信息,而是仅仅调用strategy的一个方法。
Strategy模式目的是实现程序行为模板,即一个程序行为中部分动作是确定的,部分动作不确定,但确定部分与不确定部分有着确定的关系,比如饮料灌装流水线:第一步,准备空瓶;第二步,装满饮料;第三步,封口; 第四步,贴商标。
Stragtegy模式揭示这种步骤的确定性,但具本灌什么饮料,贴什么商标则留给具体的Strategy实现。因此,是多态、是同步的,因此,实现通常通过Call Back函数或所谓Sink机制(本质上仍是Call Back函数)。

回答2:

  -- 相同点:
  -- 毫无疑问,第一个相同点肯定是:封装变化。策略模式封装算法的变法,命令模式封装请求的变化。
  -- 都使用组合来实现功能,达到解耦的目的。
  -- 如果我们将命令模式做更高层次上的抽象,可以将它看成是一种策略模式。如:我们将Client与
  Invoker封装到一起,将Concrete Command与Receiver封装到一起。
  -- 策略(Strategy)模式:
  -- 策略模式实际上比较简单。Head First Design Pattern介绍的第一个模式就是策略模式。
  -- GoF定义:定义一组算法,把他们封装起来,并且是他们可以相互替换。该模式使算法可以独立于使
  用它的客户而变化。
  -- 实现:其实一句话就可以说明该模式的精髓:面向抽象编程。用户维护一个该系列算法的统一接口,
  可以互相替换的算法实现该接口。从而将客户与具体的算法实现解耦。
  -- 命令(Command)模式:
  -- 命令模式要比策略模式复杂一些。这可以从命令模式结构图(在专门介绍命令模式的博文中有)中
  所涉及的角色数量可做出不印证。
  -- 命令模式涉及的角色有:Client, Command Interface, Concrete Command, Invoker以及真正处理请
  求的Receiver;而策略模式只需要:Client, Strategy Interface以及Concrete Strategy.
  -- GoF定义:将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或
  记录请求日志,以及支持可撤销的操作。
  -- 实现:Client创建一个Command,并为Command绑定一个Receiver。将该Command传给一个Invoker,当
  Invoker被唤醒时,调用Command的Execute方法,而Execute方法则最终调用Receiver的相关方法完成
  请求。当然Client中可以维护一个Command队列,Command中也可以实现一个undo操作。从而实现对操
  作的撤销与重做。
  -- 结论:命令模式可以被抽象地视为一种策略模式。但是显然命令模式处理的是更为复杂的情况。或许我们
  可以这么讲:策略模式聚焦的是对相同请求更换解决方案的灵活性;而命令模式聚焦的是对多请求变化的
  封装以及对相同请求不同的请求形式解决方法的可复用性(例如GOFDP中提出的文本编辑器来自不同按钮/菜
  单项的请求实现相同的功能)。

————浪逐风的博客

回答3:

你问的是关于什么内容的?