設計模式 命令模式

2021-08-25 17:35:27 字數 2938 閱讀 5826

將來自客戶端的請求傳入乙個物件,從而使你可用不同的請求對客戶進行引數化。用於「行為請求者」與「行為實現者」解耦,可實現二者之間的松耦合,以便適應變化。分離變化與不變的因素。

將乙個請求(呼叫)封裝為乙個物件,從而可用不同的請求對客戶進行引數化,將「發出請求的物件」和「接收和執行請求的物件」分離開。它的精髓在於封裝了具體的呼叫。 

我們從定義中了解到,乙個命令物件通過在特定命令接受者上繫結一組動作來封裝乙個請求。要達到這一點,命令物件將動作和動作的接收者封裝在物件中,這個物件只暴露乙個execute方法,此方法被呼叫時,接收者就會執行這些動作。從外部來看,其他物件(包括呼叫者)並不知道哪些接收者進行了哪些動作,只知道只要呼叫execute方法,請求的目的就會達到。

(1)抽象命令角色(command):抽象命令,包含命令執行的抽象方法

(2)命令接收者(receiver):命令接收者角色,它包含所有命令的具體行為實現方法。

(3)具體命令角色(concretecommand):它包含乙個命令接收者物件,並呼叫接收者的物件相應實現方法。

(4)命令呼叫者角色(invoker):要求命令物件執行請求,通常會持有命令物件,可以持有很多的命令物件。這個是客戶端真正觸發命令並要求命令執行相應操作的地方,也就是說相當於使用命令物件的入口。

(5)客戶端(client):建立具體的命令物件,並且設定命令物件的接收者。注意這個不是我們常規意義上的客戶端,而是在組裝命令物件和接收者,或許,把這個client稱為裝配者會更好理解,因為真正使用命令的客戶端是從invoker來觸發執行。

commend:

public inte***ce command
recevier

public class receiver()

//實現撤銷業務方法

public void unaction()

}

concretecommand

public class concretecommand implements command

public void execute()

publc void undo()

}

invoker

public class invoker 

public command getcommand()

/*** 執行命令

*/public void runcommand()

/*** 撤銷命令

*/public void undocommand()

}

client

public class client 

}

​​​​​​
//執行命令的介面

public inte***ce command

//命令接收者receiver

public class tv

public void turnoff()

public void changechannel(int channel)

}//開機命令concretecommand

public class commandon implements command

public void execute()

}//關機命令concretecommand

public class commandoff implements command

public void execute()

}//頻道切換命令concretecommand

public class commandchange implements command

public void execute()

}//空命令

pubilc class nocommand implements command

public void undo(){}

}//invoker

public class control

public void turnon()

public void turnoff()

public void changechannel()

}//測試類client

public class client

}

​​​​​
1、我們可以根據命令模式原理實現巨集命令,所謂巨集命令,就是在某個命令實現類的execute方法中呼叫多個receiver的具體執行方法,達到一次呼叫,執行多個方法的效果。

2、通過命令模式實現請求佇列,命令可以將運算塊打包(乙個接受者和一組動作),然後將它傳來傳去,即使命令模式建立好久後,依然可以執行運算,甚至可以在不同執行緒中執行。想象有乙個工作佇列:你在某一端新增命令,另一端是乙個執行緒,執行緒執行如下動作:從佇列中取出命令,呼叫execute執行命令,將該命令丟棄,取出下乙個命令。。。

3、通過命令模式進行日誌記錄,我們在執行命令時,將執行歷史記錄儲存在磁碟上,這樣一旦系統宕機,我們可以根據記錄的日誌依次呼叫execute方法恢復系統

優點:1.降低物件之間的耦合度。

2.新的命令可以很容易地加入到系統中。

3.可以比較容易地設計乙個組合命令。

4.呼叫同一方法實現不同的功能

缺點:使用命令模式可能會導致某些系統有過多的具體命令類。因為針對每乙個命令都需要設計乙個具體命令類,因此某些系統可能需要大量具體命令類,這將影響命令模式的使用。

設計模式 命令設計模式

一句話總結 命令設計模式的實質是將命令定義,命令的執行分離開,從而提公升了系統的解藕性 結構 命令的抽象command 命令的具體實現concretecommand 命令處理者抽象ireceiver 命令處理者的具體實現concretereceiver 命令的呼叫者invoker 客戶端client...

設計模式 命令模式

1 命令模式的角色組成 1 命令角色 command 生命執行操作的介面。介面或抽象類來實現。2 具體命令角色 concrete command 將乙個接收者物件繫結於乙個動作 呼叫接收者相應的操作,以實現命令角色宣告的執行操作的介面。3 客戶角色 client 建立乙個具體命令物件 並可以設定它的...

設計模式 命令模式

1 command.h ifndef command h define command h include include include using namespace std class chef 廚師,具體命令的執行者 class command 命令基類 class makemuttonco...