**定義**:將一個請求封裝成一個對象,從而讓你使用不同的請求把客戶端參數化,對請求排隊或者記錄請求日志,
可以提供命令的撤銷和恢復功能。
## 命令模式的通用模式:

**該類圖中**
Receive接受者角色
---|該角色就是干活的角色,命令傳遞到這里應該是被執行的
Command命令角色
---|需要執行的所有命令都在這里聲明
Invoker調用者角色
---|接收命令,并執行命令。
~~~
public class CommandTest {
public static void main(String[] args) {
//首先聲明調用者Invoker
MyInvoker invoker = new MyInvoker();
//聲明命令的接收者
Receiver receiver1 = new ConcreteReceive1();
//聲明命令
Command command1 = new ConcreteCommand1(receiver1);
invoker.setCommand(command1);
invoker.action();
}
}
abstract class Receiver{
//抽象的接收者,定義具體接受者要實現的方法
public abstract void doSomething();
}
class ConcreteReceive1 extends Receiver{
@Override
public void doSomething() {
System.out.println("接收者1號,需要執行的方法....");
}
}
class ConcreteReceiver2 extends Receiver{
@Override
public void doSomething() {
System.out.println("接收者2號,需要執行的方法...");
}
}
abstract class Command{
//抽象的命令類,定義要執行的命令,具體命令主體由子類來完成。
public abstract void execute();
}
class ConcreteCommand1 extends Command{
private Receiver receiver;
//用構造函數來傳遞,具體的接收者是誰。
public ConcreteCommand1(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
//讓接收者去執行具體的方法。
this.receiver.doSomething();
}
}
class ConcreteCommand2 extends Command{
private Receiver receiver;
//用構造函數來傳遞,具體的接收者是誰。
public ConcreteCommand2(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
//讓接收者去執行具體的方法。
this.receiver.doSomething();
}
}
class MyInvoker{
private Command command;
//調用者角色,去決定具體的接收者執行什么命令
public void setCommand(Command command) {
this.command = command;
}
public void action() {
this.command.execute();
}
}
~~~
## 一個例子:
一個項目組分為需求組(require),美工組,編碼組,三部分。客戶在進行修改需求、美工時需要對各個部門進行交互。
但是這樣的做法對客戶來說十分不便捷。因此需要一個中介者替客戶傳達他對各項目組的需求。
他將客戶一系列的命令(Command)傳達給不同的項目小組。

~~~
public class CommandEx {
public static void main(String[] args) {
//首選創建一個指揮者實體
Invoker invok = new Invoker();
//命令實體要求添加一個需求
CommandWork cw1 = new AddRequire();
CommandWork cw2 = new DelPage();
//指揮者,設置好命令
invok.addCommand(cw1);
invok.addCommand(cw2);
//指揮者去傳達命令。
invok.action();
}
}
abstract class GroupWork{
/**
* 抽象的項目工作類,定義需要的方法供實現類去執行。
*/
//找具體的執行者
public abstract void find();
//要求添加功能
public abstract void add();
//要求刪除功能
public abstract void delete();
//要求修改功能
public abstract void change();
//要求制定出具體的計劃
public abstract void plan();
}
/**
* 美工組,執行任務
* @author admin
*
*/
class PageGroup extends GroupWork{
@Override
public void find() {
System.out.println("找到美工組....");
}
@Override
public void add() {
System.out.println("要求美工組添加一張圖片...");
}
@Override
public void delete() {
System.out.println("要求美工組刪除一張圖片....");
}
@Override
public void change() {
System.out.println("要求美工組修改這張頁面....");
}
@Override
public void plan() {
System.out.println("要求美工組制定出具體計劃....");
}
}
/*
* 編碼組,執行任務
*/
class CodeGroup extends GroupWork{
@Override
public void find() {
System.out.println("找到程序員....");
}
@Override
public void add() {
System.out.println("要求程序員添加一個絢麗的功能...");
}
@Override
public void delete() {
System.out.println("要求程序員刪除有bug的功能....");
}
@Override
public void change() {
System.out.println("要求程序員修改具體功能....");
}
@Override
public void plan() {
System.out.println("要求程序員制定出詳細的計劃....");
}
}
/**
* 需求組執行任務。
* @author admin
*
*/
class requireGroup extends GroupWork{
@Override
public void find() {
System.out.println("找到需求組....");
}
@Override
public void add() {
System.out.println("要求需求組添加一項功能...");
}
@Override
public void delete() {
System.out.println("要求需求組刪除項功能....");
}
@Override
public void change() {
System.out.println("要求美需求組修改一項....");
}
@Override
public void plan() {
System.out.println("要求需求組制定詳細的需求分析....");
}
}
abstract class CommandWork{
/**
* 模擬客戶提出要求,并且讓具體的項目組去執行任務。
*/
//這里已經知道這三類項目小組,所以在抽象類中直接實例化
GroupWork rg = new requireGroup();
GroupWork pg = new PageGroup();
GroupWork cg = new CodeGroup();
public abstract void executeWork();
}
class AddRequire extends CommandWork{
@Override
public void executeWork() {
//找到需求組
super.rg.find();
//添加一個功能
super.rg.add();
//指定具體計劃
super.rg.plan();
}
}
class DelPage extends CommandWork{
@Override
public void executeWork() {
//找到需求組
super.pg.find();
//添加一個功能
super.pg.delete();
//指定具體計劃
super.rg.plan();
}
}
class Invoker{
/**
* 命令的調用者,通過該類,向項目組傳達客戶的命令。
* 相當于項目經理。
*/
private ArrayList<CommandWork> command_list = new ArrayList<CommandWork>();
public void addCommand(CommandWork command){
this.command_list.add(command);
}
public void action(){
if(command_list.size()>0){
for(CommandWork cw : command_list){
cw.executeWork();
}
}
/*//接收到命令,就去轉達
this.cw.executeWork();*/
}
}
~~~
**命令模式的優點:**
* 類間解耦
* 可擴展性
* 命令模式結合其他模式更優秀
- 前言
- 6大設計原則(一)---單一職責原則
- 6大設計原則(二)---里氏替換原則
- 6大設計原則(三)---依賴倒置原則
- 6大設計模式(四)----接口隔離原則
- 6大設計原則(五)---迪米特法則
- 6大設計原則(六)---開閉原則。
- 設計模式(一)---單例模式
- 設計模式(二)---工廠方法模式
- 設計模式(三)---抽象工廠模式
- 設計模式(四)---模板方法模式
- 設計模式(五)---建造者模式
- 設計模式(六)---代理模式
- 設計模式(七)---原型模式
- 設計模式(八)---中介者模式
- 設計模式(九)---命令模式
- 設計模式(十)---責任鏈模式
- 設計模式(十一)---裝飾模式
- 設計模式(十二)---策略模式
- 設計模式(十三)---適配器模式
- 設計模式(十四)---迭代器模式
- 設計模式(十五)---組合模式
- 設計模式(十六)---觀察者模式
- 設計模式(十七)---門面模式
- 設計模式(十八)---備忘錄模式
- 設計模式(十八)---訪問者模式
- 設計模式(二十)---狀態模式
- 設計模式(二十二)---享元模式
- 設計模式(二十三)---橋梁模式