1. 程式人生 > >設計模式(一)——命令模式

設計模式(一)——命令模式

進行 span request st2 ges 耦合 i++ 設計 ima

1.描述

將一個請求封裝為一個對象,從而使用戶可以用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷操作。

2.用途

在程序設計中,經常涉及道一個對象請求另一個對象調用其方法的情況。如果請求者不希望或無法直接和請求者打交道,即不希望或無法包含被請求者的引用,就可以使用命令模式。

在軟件系統中,行為請求者與行為實現者通常是一種緊耦合的關系,但某些場合,比如需要對行為進行記錄、撤銷或重做、事務等處理時,這種無法抵禦變化的緊耦合的設計就不太合適,這是就是不希望請求者包含被請求者的引用以降低耦合度。

3.模式的使用

命令模式中有四種角色

·接受者(Receiver):接受者是一個類的示實例,該實例負責執行與請求相關的操作。

·命令(Command)接口:命令時一個接口,規定了用來封裝“請求”的若幹方法。

·具體命令(ConcreteCommand):具體命令是實現命令接口的類的實例。具體命令必須實現命令接口中的方法。

·請求者(Invoker):請求者是一個包含Conmmand接口變量的類的實例。請求者中的Command接口的變量可以存放任何具體命令的引用。請求者負責調用具體命令,讓具體命令執行那些封裝了“請求”的方法。

4.UML圖

技術分享

5.案例

要求:請求者請求只輸出英文字母表,只輸出俄文字母表,只輸出1~N的偶數,或者任意組合以上請求的命令。

對於上述問題我們設計

兩個接受者:

PrintLetter打印英文字母或俄文字母

PrintEvenNumber打印偶數

命令接口:

Command

三個具體命令以及一個宏命令:

PrintEnglishCommand(打印英文字母)

PrintRussianCommand(打印俄文字母)

PrintEvenNumberCommand(打印偶數)

MacroCommand(宏命令)

代碼:

  1 package 命令模式.test2;
  2 /**
  3  * 接受者,打印字母
  4  */
  5 public class PrintLetter {
  6     public void printEnglish(){
  7         for(char
c = ‘a‘; c < ‘z‘; c++ ) 8 System.out.print(c + "\t"); 9 } 10 11 public void printRussian(){ 12 for(char c = ‘а‘; c < ‘я‘; c++ ) 13 System.out.print(c + "\t"); 14 } 15 } 16 17 18 package 命令模式.test2; 19 20 /** 21 * 接受者,打印數字 22 */ 23 public class PrintNumber { 24 int n; 25 PrintNumber(int n){ 26 this.n = n; 27 } 28 29 public void printEvenNmuber(){ 30 for(int i = 1; i <= n; i++) 31 if(i % 2 ==0) 32 System.out.println(i + "\t"); 33 } 34 } 35 36 37 package 命令模式.test2; 38 39 /** 40 * 命令接口 41 */ 42 public interface Command { 43 public abstract void execute(); 44 } 45 46 47 package 命令模式.test2; 48 49 /** 50 * 打印英文字母具體命令 51 */ 52 public class PrintEnglishCommand implements Command { 53 PrintLetter letter; 54 PrintEnglishCommand(PrintLetter letter){ 55 this.letter = letter; 56 } 57 public void execute() { 58 letter.printEnglish(); 59 } 60 61 } 62 63 64 package 命令模式.test2; 65 66 /** 67 * 打印俄文字母具體命令 68 */ 69 public class PrintRussianCommand implements Command { 70 PrintLetter letter; 71 public PrintRussianCommand(PrintLetter letter) { 72 this.letter = letter; 73 } 74 75 public void execute() { 76 letter.printRussian(); 77 } 78 79 } 80 81 82 package 命令模式.test2; 83 84 /** 85 * 打印偶數具體命令 86 */ 87 public class PrintEvenNumberCommand implements Command { 88 PrintNumber letter; 89 public PrintEvenNumberCommand(PrintNumber letter) { 90 this.letter = letter; 91 } 92 public void execute() { 93 letter.printEvenNmuber(); 94 } 95 96 } 97 98 99 package 命令模式.test2; 100 101 import java.util.ArrayList; 102 103 /** 104 * 宏命令,具體命令 105 */ 106 public class MacroCommand implements Command { 107 ArrayList<Command> commandList; 108 public MacroCommand(ArrayList<Command> commandList) { 109 this.commandList = commandList; 110 } 111 112 public void execute() { 113 for(int i = 0; i < commandList.size(); i++) 114 commandList.get(i).execute(); 115 } 116 117 } 118 119 120 package 命令模式.test2; 121 122 /** 123 * 請求者 124 */ 125 public class Request { 126 Command command; 127 public void setCommand(Command command){ 128 this.command = command; 129 } 130 131 public void execute(){ 132 command.execute(); 133 } 134 } 135 136 137 package 命令模式.test2; 138 139 import java.util.ArrayList; 140 141 public class test { 142 143 144 public static void main(String[] args) { 145 ArrayList<Command> commandList = new ArrayList<Command>(); 146 Request request = new Request(); //創建請求者 147 Command c1 = new PrintEnglishCommand(new PrintLetter()); 148 Command c2 = new PrintRussianCommand(new PrintLetter()); 149 Command c3 = new PrintEvenNumberCommand(new PrintNumber(20)); 150 commandList.add(c1); 151 commandList.add(c2); 152 commandList.add(c3); 153 Command MacroCommand = new MacroCommand(commandList); 154 request.setCommand(MacroCommand); 155 request.execute(); 156 } 157 158 }

設計模式(一)——命令模式