青玄 发表于 2015-1-28 11:04:55

java设计模式之命令模式

命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。  每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。  命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:  (1)命令模式使新的命令很容易地被加入到系统里。  (2)允许接收请求的一方决定是否要否决请求。  (3)能较容易地设计一个命令队列。  (4)可以容易地实现对请求的撤销和恢复。  (5)在需要的情况下,可以较容易地将命令记入日志。看类图:

从图中可以看出Command抽象类:客户端给我们的命令,定义三个工作组的成员变量,供子类使用; 定义一个抽象方法execute,由子类来实现;Invoker实现类:项目接头人,setCommand接收客户端发给我们的命令,action方法是执行客户端的命令;在上面说了Command抽象类中,定义了三个工作组的成员,所以,首先写的是这三个成员;那就先写一个Group的抽象类吧:public abstract class Group
{
    public abstract void find();
    public abstract void add();
    public abstract void delete();
    public abstract void change();

    public abstract void plan();
}
然后就是继承Group的三个工作组的子类:需求组:public class RequirementGroup extends Group
{
    public void find()
    {
       System.out.println("找到需求组...");
    }
   public void add()
    {
       System.out.println("客户要求增加一项需求...");
    }


    public void change()
    {
      System.out.println("客户要求修改一项需求...");
    }
    public void delete()
    {
      System.out.println("客户要求删除一项需求...");
    }
    public void plan()
    {
      System.out.println("客户要求需求变更计划...");
    }

}
页面设计组:public class PageGroup extends Group
{
   public void find()
   {
         System.out.println("找到美工组....");
   }

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

   public void change()
   {
         System.out.println("客户要求修改一个页面....");
   }
   public void delete()
   {
         System.out.println("客户要求删除一个页面....");
   }
   public void plan()
   {
         System.out.println("客户要求页面变更计划....");
   }

}
代码组:public class CodeGroup extends Group
{
    public void find()
    {
      System.out.println("找到代码组");
    }

    public void add()
    {
      System.out.println("客户要求增加一项功能...");
    }
    public void change()
    {
      System.out.println("客户要求修改一项功能...");
    }

   public void delete()
   {
      System.out.println("客户要求删除一项功能....");
   }
   public void plan()
   {
      System.out.println("客户要求代码变更计划...");
   }


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

}
public class DeletePageCommand extends Command
{
   public void execute()
   {
         super.pg.find();
         super.rg.find();
         super.rg.plan();
   }
}
我们再看我们的接头人,就是 Invoker 类的实现:public class Invoker
{
    private Command command;

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

    public void action()
    {//执行客户的命令
       this.command.execute();
    }
}
这下就是客户这儿准备发命令了:public class Client
{
   public static void main(String args[])
   {
      Invoker invoker = new Invoker();
      System.out.println("---------客户要求增加一个需求--------");

      Command command = new AddRequirementCommand();
      invoker.setCommand(command);
      invoker.action();
   }
}
效果:























页: [1]
查看完整版本: java设计模式之命令模式