命令模式

1.概念

  将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。

   在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。

但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。

Command模式可应用于
a)整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
b)调用前后需要对调用参数进行某些处理。
c)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

Command模式有如下效果:
a)将调用操作的对象和知道如何实现该操作的对象解耦。
b)Command是头等对象。他们可以像其他对象一样被操作和扩展。
c)你可将多个命令装配成一个符合命令。
d)增加新的Command很容易,因为这无需改变现有的类。

 

2.UML

命令模式

3.应用

 例子: 模拟安装向导的上一步,下一步,command具体类中的execute模仿下一步,unexecute模仿上一步,在其实现逻辑中可以完成上一步或下一步要操作的逻辑。

command类:

 public abstract class Command {
 public abstract void execute();
 public abstract void unexecute();
}

command具体类:

public class ConcreateCommand extends Command{
 Reciver reciver;
 int id;
 
 public void setID(int id){
  this.id=id;
 }
 
 public ConcreateCommand(Reciver reciver,int id){
  this.reciver = reciver;
  this.id=id;
 }
 public void setReciver(Reciver reciver) {
  this.reciver = reciver;
 }
 @Override
 public void execute() {
  // TODO Auto-generated method stub
  System.out.println("command id:"+id);
  reciver.doComand();
 }
 @Override
 public void unexecute() {
  // TODO Auto-generated method stub
    System.out.println("command id:"+id);
    reciver.undoCommand(); 
 }
}

Reciver命令接受者:

 public abstract class Reciver {
  public abstract void doComand();
  
  public abstract void undoCommand();
}

Reciver命令接受者具体类:

 public class ConcreateReciver extends Reciver{
 @Override
 public void doComand() {
  // TODO Auto-generated method stub
  System.out.println("do command~");
 }
 @Override
 public void undoCommand() {
  // TODO Auto-generated method stub
  System.out.println("undo command~");
 }
}

Invoker 命令调用者类:

 public class Invoker {
 private int postion;
 
 List<Command> list;
 
 public boolean check(){
  return postion==list.size()-1;
 }
 
 public int getPostion(){
  return postion;
 }
 
 public int commandListSize(){
  return list.size();
 }
 
 public Invoker(){
  list=new ArrayList<Command>();
  postion=-1;
 }
 
 /**
  * 添加命令
  * @param command
  */
 public void addAction(Command command){
  list.add(command);
 }
 /**
  * ,类似于安装向导中的下一步
  */
 public void doAction(){
  postion+=1;
  list.get(postion).execute();
 }
 
 /**
  * 类似于安装向导中的上一步
  */
 public void undoAction(){
   if(!(postion<0)){
    list.get(postion).unexecute();
    postion-=1;
   }
 }
 
 
}

测试类:

 public static void main(String[] args) {
  // TODO Auto-generated method stub
  Reciver reciver=new ConcreateReciver();
  Invoker invoker=new Invoker();
  Scanner s=new Scanner(System.in);
  int flag;
  int num=0;
  while(true){
   flag=s.nextInt();
   if(flag==1){
    
    if(invoker.check()){
     invoker.addAction(new ConcreateCommand(reciver,num));
    }
    invoker.doAction();
    num++;
   }else if(flag==2){
    invoker.undoAction();
   }else{
    break;
   }
  }
  s.close();
  
 }

参考:

http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html

你可能感兴趣的:(命令模式)