java設計模式 命令模式

2021-06-17 00:39:48 字數 2498 閱讀 8208

1.概念

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

在物件導向的程式設計中,乙個物件呼叫另乙個物件,一般情況下的呼叫過程是:建立目標物件例項;設定呼叫引數;呼叫目標物件的方法。

但在有些情況下有必要使用乙個專門的類對這種呼叫過程加以封裝,我們把這種專門的類稱作command類。

command模式可應用於

a)整個呼叫過程比較繁雜,或者存在多處這種呼叫。這時,使用command類對該呼叫加以封裝,便於功能的再利用。

b)呼叫前後需要對呼叫引數進行某些處理。

c)呼叫前後需要進行某些額外處理,比如日誌,快取,記錄歷史操作等。

command模式有如下效果:

a)將呼叫操作的物件和知道如何實現該操作的物件解耦。

b)command是頭等物件。他們可以像其他物件一樣被操作和擴充套件。

c)你可將多個命令裝配成乙個符合命令。

d)增加新的command很容易,因為這無需改變現有的類。

下面給個例子,是模擬對電視機的操作有開機、關機、換台命令。**如下

//命令接收者

public class tv

public void turnoff()

public void changechannel(int channel)

}//執行命令的介面

public inte***ce command

//開機命令

public class commandon implements command

public void execute()

}//關機命令

public class commandoff implements command

public void execute()

}//頻道切換命令

public class commandchange implements command

public void execute()

}//可以看作是遙控器吧

public class control

public void turnon()

public void turnoff()

public void changechannel()

}//測試類

public class client

}執行結果為:

the televisino is on.

now tv channel is 2

the television is off.

4.應用場景在下面的情況下應當考慮使用命令模式:1)使用命令模式作為"callback"在物件導向系統中的替代。"callback"講的便是先將乙個函式登記上,然後在以後呼叫此函式。2)需要在不同的時間指定請求、將請求排隊。乙個命令物件和原先的請求發出者可以有不同的生命期。換言之,原先的請求發出者可能已經不在了,而命令物件本身仍然是活動的。這時命令的接收者可以是在本地,也可以在網路的另外乙個位址。命令物件可以在串形化之後傳送到另外一台機器上去。

3)系統需要支援命令的撤消(undo)。命令物件可以把狀態儲存起來,等到客戶端需要撤銷命令所產生的效果時,可以呼叫undo()方法,把命令所產生的效果撤銷掉。命令物件還可以提供redo()方法,以供客戶端在需要時,再重新實施命令效果。

4)如果乙個系統要將系統中所有的資料更新到日誌裡,以便在系統崩潰時,可以根據日誌裡讀回所有的資料更新命令,重新呼叫execute()方法一條一條執行這些命令,從而恢復系統在崩潰前所做的資料更新。

Java設計模式 命令模式

命令模式定義 命令模式通過被稱為command的類封裝了對目標物件的呼叫行為以及呼叫引數。將乙個請求封裝稱為乙個命令,從而使你不同的請求對客戶進行引數化 隊請求排隊或記錄請求日誌,以及支援可撤銷的操作。優點 解耦了呼叫者與接受者之間的聯絡。呼叫者呼叫乙個操作,接受者接受請求執行相應的動作,因為使用命...

JAVA設計模式 命令模式

命令模式,又稱為行動 action 模式 交易 transaction 模式,是一種行為型設計模式。命令模式的思想是 把乙個請求或者操作封裝到乙個物件中,允許系統使用不同的請求把客戶端引數化,從而實現對請求排隊或者記錄請求日誌 提供命令的撤銷和恢復功等能。命令模式涉及5個角色 結構圖 具體 實現 接...

java設計模式 命令模式

package com.hcmony.command author hcmony since v1.0.0,2018 04 09 17 18 public inte ce commandinteface package com.hcmony.command author hcmony since v...