1 public interface Command { 2 public abstract void execute ( ); 3 }
1 public class Engineer implements Command { 2 public void execute( ) { 3 //do Engineer's command 4 } 5 } 6 7 public class Programmer implements Command { 8 public void execute( ) { 9 //do programmer's command 10 } 11 } 12 13 public class Politician implements Command { 14 public void execute( ) { 15 //do Politician's command 16 } 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的"兒子".所以強制轉換類型為接口Command 7 ((Command)it.next()).execute(); 8 } 9 }由此可見,調用者基本只和接口打交道,不合具體實現交互,這也體現了一個原則,面向接口編程,這樣,以後增加第四個具體命令時,就不必修改調用者TestCommand中的代碼了。