命令模式(Command):將“請求”(命令/口令)封裝成一個對象,以便使用不同的請求、隊列或者日志來參數化其對象。命令模式也支持撤銷操作。命令模式的目的就是達到命令的發出者和執行者之間解耦,實現請求和執行分開。
##一、uml建模

##二、代碼實現:
~~~
/**
* 示例:以咱去餐館吃飯為例,分為3步
*
* 1、和小二說,來個宮保雞丁 --> 顧客發出口令
*
* 2、小二來了一句:宮保雞丁一份。 這時命令被傳遞到了廚師。--> 口令傳遞到了廚師
*
* 3、然后廚師就開始做宮保雞丁去了。 --> 廚師根據口令去執行
*
* 從這3步可以看到,宮保雞丁并不是我想吃就我來做,而是傳達給別人去做。
*
* 我要的是一個結果——宮保雞丁這道菜做好了,而我無需去關系這道菜是怎么去做的。
*/
interface Command {
/**
* 口令執行
*/
public void execute();
/**
* 口令撤銷
*/
public void undo();
}
/**
* 口令 -- 經小二傳遞
*/
class OrderCommand implements Command {
private CookReceiver cook;
public OrderCommand(CookReceiver cook) {
this.cook = cook;
}
@Override
public void execute() {
cook.cooking();
}
@Override
public void undo() {
cook.unCooking();
}
}
/**
* 廚師--真正的口令執行者
*/
class CookReceiver {
public void cooking() {
System.out.println("開始炒宮保雞丁了...");
}
public void unCooking() {
System.out.println("不要炒宮保雞丁了...");
}
}
/**
* 顧客--真正的口令發出者
*/
class Customer {
private Command command;
public Customer(Command command) {
this.command = command;
}
/**
* 將命令的發出與執行分開
*/
public void order() {
command.execute();
}
public void unOrder() {
command.undo();
}
}
/**
* 客戶端測試類
*
* @author Leo
*/
public class Test {
public static void main(String[] args) {
/**
* 等待口令的執行者 --炒菜總得有個廚師吧.
*/
CookReceiver receiver = new CookReceiver();
/**
* 等待將口令傳達給廚師 --因為顧客要什么菜還不知道,但口令始終要傳達到廚師耳朵里這是肯定的。
*/
Command cmd = new OrderCommand(receiver);
Customer customer = new Customer(cmd);
/**
* 執行口令
*/
customer.order();
/**
* 撤銷口令
*/
customer.unOrder();
}
}
~~~
##三、應用場景
菜館點餐、遙控器、隊列請求、日志請求。
##四:小結
從上面的示例可以看到:命令模式將“動作的請求者”從“動作的執行者”對象中解耦出來,這就是將方法的調用封裝起來的好處。
- 前言
- (一)策略模式建模與實現
- (二)觀察者模式建模與實現
- (三)裝飾者模式建模與實現
- (四)工廠方法模式建模與實現
- (五)抽象工廠模式建模與實現
- (六)單例模式建模與實現
- (七)命令模式建模與實現
- (八)適配器模式建模與實現
- (九)外觀模式建模與實現
- (十)模板方法模式建模與實現
- (十一)迭代器模式建模與實現
- (十二)組合模式建模與實現
- (十三)狀態模式建模與實現
- (十四)代理模式建模與實現
- (十五)建造者模式建模與實現
- (十六)原型模式建模與實現
- (十七)橋接模式建模與實現
- (十八)責任鏈模式建模與實現
- (十九)備忘錄模式建模與實現
- (二十)解釋器模式建模與實現
- (二十一)享元模式建模與實現
- (二十二)中介者模式建模與實現
- (二十三)訪問者模式建模與實現
- Java設計模式博客全目錄