Design Patterns 之命令模式

电玩女神 2022-11-21 14:45 303阅读 0赞

一、前言

在许多设计中,经常会出现一个对象直接请求另一个对象调用其方法以达到某种目的的行为,这里的两个类之间就会出现紧耦合。这很不好,所以我们应该将 方法的请求者方法的实现者 分开。

比如我们可以直接用手按电视机上的按钮调节音量,这样对我们来说很麻烦,我们可以使用遥控器作为中介,相当于一个命令,这样以后就可以使用电视机遥控器(命令发送者)通过按钮(具体命令)来遥控电视机(命令接收者)。

二、结构

命令模式包含以下角色:

  1. 抽象命令类 Command:声明执行命令的接口;
  2. 具体命令角色 Concrete Command:抽象命令类的具体实现类;
  3. 实现者、接收者 Receiver:执行命令功能的相关操作;
  4. 调用者、请求者 Invoker:是请求的发送者,通常拥有很多命令对象。

三、实现

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70_pic_center

  1. package command;
  2. public class CommandPattern
  3. {
  4. public static void main(String[] args)
  5. {
  6. Command cmd=new ConcreteCommand();
  7. Invoker ir=new Invoker(cmd);
  8. System.out.println("客户访问调用者的call()方法...");
  9. ir.call();
  10. }
  11. }
  12. //调用者
  13. class Invoker
  14. {
  15. private Command command;
  16. public Invoker(Command command)
  17. {
  18. this.command=command;
  19. }
  20. public void setCommand(Command command)
  21. {
  22. this.command=command;
  23. }
  24. public void call()
  25. {
  26. System.out.println("调用者执行命令command...");
  27. command.execute();
  28. }
  29. }
  30. //抽象命令
  31. interface Command
  32. {
  33. public abstract void execute();
  34. }
  35. //具体命令
  36. class ConcreteCommand implements Command
  37. {
  38. private Receiver receiver;
  39. ConcreteCommand()
  40. {
  41. receiver=new Receiver();
  42. }
  43. public void execute()
  44. {
  45. receiver.action();
  46. }
  47. }
  48. //接收者
  49. class Receiver
  50. {
  51. public void action()
  52. {
  53. System.out.println("接收者的action()方法被调用...");
  54. }
  55. }

下面再来看一下具体的例子:客户去餐馆吃饭,有肠粉、河粉、混沌,客户向服务员选择以上早餐的几种,服务员将客户的请求交给相关的厨师去做。这里的早餐相当于 命令 ,服务员相当于 调用者 ,厨师相当于 接收者


首先,定义一个早餐类(Breakfast),它是抽象命令类,有抽象方法 cooking(),说明要做什么;再定义其子类肠粉类(ChangFen)、馄饨类(HunDun)和河粉类(HeFen),它们是具体命令类,实现早餐类的 cooking() 方法,但它们不会具体做,而是交给具体的厨师去做;具体厨师类有肠粉厨师(ChangFenChef)、馄蚀厨师(HunDunChef)和河粉厨师(HeFenChef),他们是命令的接收者;最后,定义服务员类(Waiter),它接收客户的做菜请求,并发出做菜的命令。客户类是通过服务员类来点菜的。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzk0MTM2NA_size_16_color_FFFFFF_t_70_pic_center 1


具体的代码就不写了,上面的例子主要是想让读者理解命令和实现者之间的关系。

四、优缺点

优点如下:

  1. 降低系统的耦合度;
  2. 增加删除命令非常方便;
  3. 方便实现 UndoRedo 操作。

缺点是:可能产生大量的具体命令类,增加系统的复杂性。

发表评论

表情:
评论列表 (有 0 条评论,303人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Design Patterns 原型模式

    原型(`Prototype`)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这

    相关 Design Patterns 工厂模式

    现实生活中,原始社会自给自足(没有工厂),农耕社会小作坊(简单工厂,民间酒坊),工业革命流水线(工厂方法,自产自销),现代产业链代工厂(抽象工厂,富士康)。 我们的项目代码同

    相关 Design Patterns 命令模式

    一、前言 在许多设计中,经常会出现一个对象直接请求另一个对象调用其方法以达到某种目的的行为,这里的两个类之间就会出现紧耦合。这很不好,所以我们应该将 方法的请求者 和 方