命令模式是一種應(yīng)用比較廣泛的模式,它的最核心思想是命令的接受者和執(zhí)行者獨(dú)立,從而大大降低了代碼的耦合度。舉個(gè)例子,我家小朋友晚上睡覺(jué)前對(duì)媽媽(命令接受者)說(shuō)第二天早上要吃蒸雞蛋羹(發(fā)送命令);對(duì)于小朋友來(lái)說(shuō)最重要的就是第二天早上一醒來(lái)看到桌上有一碗雞蛋羹,而她根本不關(guān)心這是誰(shuí)做的(誰(shuí)執(zhí)行的相關(guān)命令),媽媽親自做的也好,爸爸愛(ài)心奉獻(xiàn)的也好,飯店里買的也不是不可以。
在適配器模式中我們提到,Garin新交了個(gè)女朋友,他每天都會(huì)收到如下命令:
Garin開(kāi)始執(zhí)行命令
飯店燒好了魚(yú)香肉絲
洗衣機(jī)洗好了衣服
在適配器模式中我們提到,Garin新交了個(gè)女朋友,他每天都會(huì)收到如下命令:
1 public interface Command {
2 public void execute();
3 }
其中一部分是做飯,一部分是洗衣服;Garin必須親自完成嗎,不一定:2 public void execute();
3 }
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 }
真正完成做飯的是一個(gè)抽象的MealSupplier.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 }
1 public interface MealSupplier {
2 public void cook(String name);
3 }
它可能代表的是一個(gè)飯店: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.
2
3 public Restaurant() {
4 super();
5 }
6
7 @Override
8 public void cook(String name) {
9 System.out.println("飯店燒好了"+name);
10 }
11
12 }
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 }
它代表的可能是洗衣機(jī):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 }
2 public void washClothes();
3 }
1 public class WashingMachine implements CanWash {
2
3 @Override
4 public void washClothes() {
5 System.out.println("洗衣機(jī)洗好了衣服");
6 }
7
8 }
Garin要做的就是坐等命令,如何執(zhí)行完全不管:2
3 @Override
4 public void washClothes() {
5 System.out.println("洗衣機(jī)洗好了衣服");
6 }
7
8 }
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("魚(yú)香肉絲"));
10 bf.addCommand(new WashCommand());
11 bf.action();
12 }
13
14 }
執(zhí)行完命令后效果如下: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("魚(yú)香肉絲"));
10 bf.addCommand(new WashCommand());
11 bf.action();
12 }
13
14 }
Garin開(kāi)始執(zhí)行命令
飯店燒好了魚(yú)香肉絲
洗衣機(jī)洗好了衣服