Note

春蚕到死丝方尽,人至期颐亦不休,一息尚存须努力,留作青年为范畴。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

介绍

概念:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。

应用场景:统一处理器的入口,由一个公共的入口来执行各种各样的请求

好处:扩展方便,入口统一

 

代码:

//处理器的接口定义

package note.com.Command;

public interface ICommand {

    public void doICommand(String label);
    
}

//定义各种情况的处理实现

package note.com.Command;

/**
 * 动物类处理
 * @author lxz
 *
 */
public class AnimalCommand  implements ICommand{

    public void doICommand(String label) {
        System.out.println(label+":由我动物类处理器处理");
    }

}
package note.com.Command;

/**
 * 鱼类处理
 * @author lxz
 *
 */
public class FishCommand  implements ICommand{

    public void doICommand(String label) {
        System.out.println(label+":由我鱼类处理器处理");
    }

}
package note.com.Command;

/**
 * 昆虫类处理
 * @author lxz
 *
 */
public class InsectCommand  implements ICommand{

    public void doICommand(String label) {
        System.out.println(label+":由我昆虫处理器处理");
    }

}
package note.com.Command;

/**
 * 人类处理器
 * @author lxz
 *
 */
public class PersonCommand  implements ICommand{

    public void doICommand(String label) {
        System.out.println(label+":由我人类处理器处理");
    }

}
package note.com.command;

/**
 * first处理器
 * @author lxz
 *
 */
public class FirstCommand  implements ICommand{

    public void doICommand(String label) {
        System.out.println(label+":由我first处理器处理");
    }

}

 

//实现一个控制处理器的分配类

package note.com.command;

import java.util.HashMap;
import java.util.Map;

/**
 * 命令执行入口
 * @author lxz
 *
 */
public class MainCommand{
    public static final String FISH = "fish";
    public static final String ANIMAL = "animal";
    public static final String INSECT = "insect";
    public static final String PERSON = "person";
    public static final String FIRST = "first";
    private Map<String,ICommand> Commands = new HashMap<String,ICommand>();
    public MainCommand(){
        Commands.put(FISH, new FishCommand());
        Commands.put(ANIMAL, new AnimalCommand());
        Commands.put(INSECT, new InsectCommand());
        Commands.put(PERSON, new PersonCommand());
        Commands.put(FIRST, new FirstCommand());
        
    }
    
    public void doICommand(String label) {
        ICommand ICommand = Commands.get(label);
        if(ICommand!=null){
            ICommand.doICommand(label);
        }
    }

}

 

 

//测试类

package note.com.Command;

/**
 * 测试类
 * @author lxz
 *
 */
public class CommandTest {
    public static void main(String[] args) {
        System.out.println("我这里有一个生物需要处理");
        String thing1 = MainCommand.INSECT;//昆虫
        String thing2 = MainCommand.ANIMAL;//动物
        new MainCommand().doICommand(thing1);
        new MainCommand().doICommand(thing2);
    }
}

//结果

我这里有一个生物需要处理
insect:由我昆虫处理器处理
animal:由我动物类处理器处理

由此,所有的待处理都从MainCommand入口进行处理,不需要知道具体是谁处理了.另外,有新增的物种需要处理时只需要扩张ICommand的实现,并且把该实现收MainCommand管理即可.  例子中没有将实际处理类与MainCommand进行分离,想要这么做也很简单,方式有很多,例如实现配置文件方式加载.

 

命令模式与职责链模式的区别

比较前文的职责链例子与本篇中的命令例子,命令模式的所有Command处理类最后由一个第三方的类来管理与分配具体的执行类.而职责链是直接请求到第一个处理类上,依次往下传递,直到有人处理.

用两张图说明他们的工作方式:

责任链工作模式:

命令模式工作模式:

 

posted on 2016-03-04 11:53  'Note'  阅读(436)  评论(0编辑  收藏  举报