典型的Command模式需要有一个接口。接口中有一个统一的方法,这就是"将命令/请求封装为对象": 1 public interface Command {2 public abstract void execute ( );3 }
具体不同命令/请求代码是实现接口Command,下面有三个具体命令: 1 public class Engineer implements Command { 2 public void execute( ) { 3 //do Engineer"s command 4 } 5 } 67 public class Programmer implements Command { 8 public void execute( ) { 9 //do programmer"s command10 }11 }12 13 public class Politician implements Command {14 public void execute( ) {15 //do Politician"s command16 }17 } 按照通常做法,我们就可以直接调用这三个Command,但是使用Command模式,我们要将他们封装起来,扔到黑盒子List里去: 1 public class producer{2 public static List produceRequests() {3 List queue = new ArrayList();4 queue.add( new DomesticEngineer() );5 queue.add( new Politician() );6 queue.add( new Programmer() );7 return queue;8 }9 } 这三个命令进入List中后,已经失去了其外表特征,以后再取出,也可能无法分辨出谁是Engineer 谁是Programmer了,看下面如何调用Command模式:1 public class TestCommand {2 public static void main(String[] args) {3 List queue = Producer.produceRequests();4 for (Iterator it = queue.iterator(); it.hasNext(); )5 //取出List中东东,其他特征都不能确定,只能保证一个特征是100%正确,6 // 他们至少是接口Command的"儿子".所以强制转换类型为接口Command7 ((Command)it.next()).execute();8 }9 } 由此可见,调用者基本只和接口打交道,不合具体实现交互,这也体现了一个原则,面向接口编程,这样,以后增加第四个具体命令时,就不必修改调用者TestCommand中的代码了。