鱼C论坛

 找回密码
 立即注册
查看: 1921|回复: 0

java设计模式之命令模式

[复制链接]
发表于 2015-1-28 11:04:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。

  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

  每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

  命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

  (1)命令模式使新的命令很容易地被加入到系统里。

  (2)允许接收请求的一方决定是否要否决请求。

  (3)能较容易地设计一个命令队列。

  (4)可以容易地实现对请求的撤销和恢复。

  (5)在需要的情况下,可以较容易地将命令记入日志。

看类图:

2015-01-28 10:44:34 的屏幕截图.png


从图中可以看出Command抽象类:客户端给我们的命令,定义三个工作组的成员变量,供子类使用; 定义一个抽象方法execute,由子类来实现;

Invoker实现类:项目接头人,setCommand接收客户端发给我们的命令,action方法是执行客户端的命令;

在上面说了Command抽象类中,定义了三个工作组的成员,所以,首先写的是这三个成员;

那就先写一个Group的抽象类吧:

  1. public abstract class Group
  2. {
  3.     public abstract void find();
  4.     public abstract void add();
  5.     public abstract void delete();
  6.     public abstract void change();

  7.     public abstract void plan();
  8. }
复制代码
然后就是继承Group的三个工作组的子类:

需求组:

  1. public class RequirementGroup extends Group
  2. {
  3.     public void find()
  4.     {
  5.        System.out.println("找到需求组...");
  6.     }
  7.      public void add()
  8.     {
  9.        System.out.println("客户要求增加一项需求...");
  10.     }


  11.     public void change()
  12.     {
  13.         System.out.println("客户要求修改一项需求...");
  14.     }
  15.     public void delete()
  16.     {
  17.         System.out.println("客户要求删除一项需求...");
  18.     }
  19.     public void plan()
  20.     {
  21.         System.out.println("客户要求需求变更计划...");
  22.     }

  23. }
复制代码
页面设计组:

  1. public class PageGroup extends Group
  2. {
  3.      public void find()
  4.      {
  5.          System.out.println("找到美工组....");
  6.      }

  7.      public void add()
  8.      {
  9.          System.out.println("客户要求增加一个页面....");
  10.      }

  11.      public void change()
  12.      {
  13.          System.out.println("客户要求修改一个页面....");
  14.      }
  15.      public void delete()
  16.      {
  17.          System.out.println("客户要求删除一个页面....");
  18.      }
  19.      public void plan()
  20.      {
  21.          System.out.println("客户要求页面变更计划....");
  22.      }

  23. }
复制代码
代码组:
  1. public class CodeGroup extends Group
  2. {
  3.     public void find()
  4.     {
  5.         System.out.println("找到代码组");
  6.     }

  7.     public void add()
  8.     {
  9.         System.out.println("客户要求增加一项功能...");
  10.     }
  11.     public void change()
  12.     {
  13.         System.out.println("客户要求修改一项功能...");
  14.     }

  15.      public void delete()
  16.      {
  17.         System.out.println("客户要求删除一项功能....");
  18.      }
  19.      public void plan()
  20.      {
  21.         System.out.println("客户要求代码变更计划...");
  22.      }


  23. }
复制代码
然后就是Command类了:
  1. public abstract class Command
  2. {
  3.     protected RequirementGroup rg = new RequirementGroup();  //需求组
  4.      protected PageGroup pg = new PageGroup();  //美工组
  5.      protected CodeGroup  cg = new CodeGroup();  //代码组
  6.     //只要一个方法,要我做什么事
  7.     public abstract void execute();
  8. }
复制代码
这个简单,看两个具体的实现类,先看 AddRequeirementCommand 类, 这个类的作用就是增加一项需求。
  1. public class AddRequirementCommand extends Command
  2. {
  3.     public void execute()
  4.     {
  5.        super.rg.find();
  6.        super.rg.add();
  7.        super.rg.plan();
  8.     }

  9. }
复制代码
  1. public class DeletePageCommand extends Command
  2. {
  3.      public void execute()
  4.      {
  5.          super.pg.find();
  6.          super.rg.find();
  7.          super.rg.plan();
  8.      }
  9. }
复制代码
我们再看我们的接头人,就是 Invoker 类的实现:
  1. public class Invoker
  2. {
  3.     private Command command;

  4.     public void setCommand(Command command)
  5.     {   //客户发出命令
  6.         this.command = command;
  7.     }

  8.     public void action()
  9.     {  //执行客户的命令
  10.        this.command.execute();
  11.     }
  12. }
复制代码
这下就是客户这儿准备发命令了:
  1. public class Client
  2. {
  3.      public static void main(String args[])
  4.      {
  5.         Invoker invoker = new Invoker();
  6.         System.out.println("---------客户要求增加一个需求--------");

  7.         Command command = new AddRequirementCommand();
  8.         invoker.setCommand(command);
  9.         invoker.action();
  10.      }
  11. }
复制代码
效果:
2015-01-28 11:04:40 的屏幕截图.png























评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
拈花小仙 + 3 + 3 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 17:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表