命令模式是一種應用比較廣泛的模式,它的最核心思想是命令的接受者和執行者獨立,從而大大降低了代碼的耦合度。舉個例子,我家小朋友晚上睡覺前對媽媽(命令接受者)說第二天早上要吃蒸雞蛋羹(發送命令);對于小朋友來說最重要的就是第二天早上一醒來看到桌上有一碗雞蛋羹,而她根本不關心這是誰做的(誰執行的相關命令),媽媽親自做的也好,爸爸愛心奉獻的也好,飯店里買的也不是不可以。
在適配器模式中我們提到,Garin新交了個女朋友,他每天都會收到如下命令:
1 public interface Command {
2 public void execute();
3 }
其中一部分是做飯,一部分是洗衣服;Garin必須親自完成嗎,不一定:
1 public class CookCommand implements GirlFriendCommand {
2
3 private String mealName = null;
4
5 public CookCommand(String mealName) {
6 super();
7 this.mealName = mealName;
8 }
9
10 private MealSupplier mealSupplier = null;
11
12 public void setMealSupplier(MealSupplier mealSupplier) {
13 this.mealSupplier = mealSupplier;
14 }
15
16 @Override
17 public void execute() {
18 mealSupplier.cook(mealName);
19 }
20
21 }
真正完成做飯的是一個抽象的MealSupplier.
1 public interface MealSupplier {
2 public void cook(String name);
3 }
它可能代表的是一個飯店:
1 public class Restaurant implements MealSupplier{
2
3 public Restaurant() {
4 super();
5 }
6
7 @Override
8 public void cook(String name) {
9 System.out.println("飯店燒好了"+name);
10 }
11
12 }
同樣的,真正洗衣服的是抽象的CanWash.
1 public class WashCommand implements GirlFriendCommand {
2
3 private CanWash wash = null;
4
5 public void setWash(CanWash wash) {
6 this.wash = wash;
7 }
8
9 @Override
10 public void execute() {
11 if(wash != null){
12 wash.washClothes();
13 }
14 }
15
16 }
它代表的可能是洗衣機:
1 public interface CanWash {
2 public void washClothes();
3 }
1 public class WashingMachine implements CanWash {
2
3 @Override
4 public void washClothes() {
5 System.out.println("洗衣機洗好了衣服");
6 }
7
8 }
Garin要做的就是坐等命令,如何執行完全不管:
1 public class GirlFriendCommandTest {
2
3 /**
4 * @param args
5 */
6 public static void main(String[] args) {
7 BoyFriend bf = new BoyFriend("Garin");
8
9 bf.addCommand(new CookCommand("魚香肉絲"));
10 bf.addCommand(new WashCommand());
11 bf.action();
12 }
13
14 }
執行完命令后效果如下:
Garin開始執行命令
飯店燒好了魚香肉絲
洗衣機洗好了衣服