亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

命令模式:將請(qǐng)求封裝為對(duì)象
什么是命令模式?

命令模式是一種行為型設(shè)計(jì)模式,它將請(qǐng)求或操作封裝成獨(dú)立的命令對(duì)象。這些命令對(duì)象包括了執(zhí)行操作所需的所有信息,例如操作方法、參數(shù)和接收者。
命令模式允許您將命令發(fā)送者(客戶端)和命令執(zhí)行者(接收者)解耦,使得發(fā)送者無需知道接收者的具體類別。
在命令模式中,通常包含以下關(guān)鍵角色:
  1. 命令(Command):聲明了執(zhí)行操作的接口,通常包括一個(gè) execute 方法。
  2. 具體命令(Concrete Command):實(shí)現(xiàn)了命令接口,包含了實(shí)際的操作邏輯。每個(gè)具體命令對(duì)象都與一個(gè)接收者相關(guān)聯(lián)。
  3. 接收者(Receiver):執(zhí)行命令實(shí)際操作的對(duì)象。
  4. 調(diào)用者(Invoker):負(fù)責(zé)調(diào)用命令對(duì)象來執(zhí)行請(qǐng)求。
  5. 客戶端(Client):創(chuàng)建命令對(duì)象并設(shè)置其接收者,然后將命令對(duì)象傳遞給調(diào)用者。

為什么需要命令模式?

命令模式有以下幾個(gè)優(yōu)點(diǎn):
  1. 解耦:命令模式可以將發(fā)送者和接收者解耦,發(fā)送者無需知道接收者的具體實(shí)現(xiàn),從而提高了系統(tǒng)的靈活性。
  2. 可擴(kuò)展性:您可以輕松地添加新的命令類,而無需修改已有的代碼。
  3. 撤銷操作:命令對(duì)象通常會(huì)保存操作的狀態(tài),從而支持撤銷操作。
  4. 日志記錄和事務(wù)管理:您可以使用命令模式來記錄所有執(zhí)行的命令,以便進(jìn)行事務(wù)管理或撤銷。

命令模式的實(shí)現(xiàn)

讓我們通過一個(gè)簡(jiǎn)單的示例來演示命令模式的實(shí)現(xiàn)。假設(shè)我們正在構(gòu)建一個(gè)遙控器應(yīng)用,用戶可以通過遙控器執(zhí)行不同的操作,例如打開電視、切換頻道和調(diào)整音量。
首先,我們定義一個(gè)命令接口 Command,它包括了一個(gè) execute 方法:

 
public interface Command {
void execute();
}
 
接下來,我們創(chuàng)建具體的命令類,例如 TurnOnCommandChangeChannelCommand 和 AdjustVolumeCommand,它們實(shí)現(xiàn)了 Command 接口,并分別執(zhí)行相應(yīng)的操作。

 
public class TurnOnCommand implements Command {
private Television television;

public TurnOnCommand(Television television) {
this.television = television;
}

public void execute() {
television.turnOn();
}
}

// 類似地實(shí)現(xiàn) ChangeChannelCommand 和 AdjustVolumeCommand
 
然后,我們創(chuàng)建接收者類 Television,它包含了實(shí)際的操作邏輯:

 
public class Television {
public void turnOn() {
System.out.println("電視已打開");
}

public void changeChannel() {
System.out.println("切換頻道");
}

public void adjustVolume() {
System.out.println("調(diào)整音量");
}
}
 
最后,我們創(chuàng)建調(diào)用者類 RemoteControl,它接收并執(zhí)行命令:

 
public class RemoteControl {
private Command command;

public void setCommand(Command command) {
this.command = command;
}

public void pressButton() {
command.execute();
}
}
 
客戶端代碼如下:

 
public class Client {
public static void mAIn(String[] args) {
Television television = new Television();

Command turnOnCommand = new TurnOnCommand(television);
Command changeChannelCommand = new ChangeChannelCommand(television);
Command adjustVolumeCommand = new AdjustVolumeCommand(television);

RemoteControl remoteControl = new RemoteControl();

remoteControl.setCommand(turnOnCommand);
remoteControl.pressButton();

remoteControl.setCommand(changeChannelCommand);
remoteControl.pressButton();

remoteControl.setCommand(adjustVolumeCommand);
remoteControl.pressButton();
}
}
 
這個(gè)示例中,我們將不同的操作(打開電視、切換頻道、調(diào)整音量)封裝成了命令對(duì)象,通過遙控器執(zhí)行這些命令,而不需要直接調(diào)用接收者的方法。

宏命令

宏命令是一種命令模式的擴(kuò)展,它允許您將多個(gè)命令組合成一個(gè)更大的命令。宏命令本身也是一個(gè)命令,可以執(zhí)行一系列子命令。這對(duì)于執(zhí)行復(fù)雜的操作或者創(chuàng)建多級(jí)撤銷機(jī)制非常有用。
讓我們通過一個(gè)示例來了解宏命令。假設(shè)我們有一個(gè)文本編輯器,需要實(shí)現(xiàn)一個(gè)宏命令來執(zhí)行以下操作:
  1. 打開文件
  2. 編輯文件
  3. 保存文件
首先,我們定義一個(gè)宏命令接口 macroCommand,它包含了 add 和 execute 方法:

 
public interface MacroCommand {
void add(Command command);
void execute();
}
 
接下來,我們創(chuàng)建一個(gè)具體的宏命令類 TextEditorMacro,它可以添加和執(zhí)行多個(gè)子命令:

 
public class TextEditorMacro implements MacroCommand {
private List<Command> commands = new ArrayList<>();

public void add(Command command) {
commands.add(command);
}

public void execute() {
for (Command command : commands) {
command.execute();
}
}
}
 
然后,我們可以創(chuàng)建多個(gè)子命令,例如 OpenFileCommandEditFileCommand 和 SaveFileCommand,它們分別執(zhí)行打開、編輯和保存文件的操作。
最后,我們可以使用宏命令將這些子命令組合成一個(gè)宏命令:

 
public class Client {
public static void main(String[] args) {
OpenFileCommand openFile = new OpenFileCommand();
EditFileCommand editFile = new EditFileCommand();
SaveFileCommand saveFile = new SaveFileCommand();

TextEditorMacro macro = new TextEditorMacro();
macro.add(openFile);
macro.add(editFile);
macro.add(saveFile);

// 執(zhí)行宏命令,依次執(zhí)行子命令
macro.execute();
}
}
 
這樣,我們就實(shí)現(xiàn)了一個(gè)宏命令,可以一次性執(zhí)行多個(gè)子命令,從而打開、編輯和保存文件。

撤銷和重做

命令模式還支持撤銷和重做操作。
為了實(shí)現(xiàn)撤銷,我們需要在命令對(duì)象中保存執(zhí)行前的狀態(tài),并提供一個(gè) undo 方法來恢復(fù)到之前的狀態(tài)。
讓我們通過一個(gè)簡(jiǎn)單的示例來演示撤銷和重做。假設(shè)我們有一個(gè)文本編輯器,可以執(zhí)行添加文本、刪除文本和撤銷操作。
首先,我們定義一個(gè)命令接口 Command,包括了 execute 和 undo 方法:

 
public interface Command {
void execute();
void undo();
}
 
接下來,我們創(chuàng)建具體的命令類,例如 AddTextCommand 和 DeleteTextCommand,它們分別執(zhí)行添加文本和刪除文本的操作,并實(shí)現(xiàn)了 undo 方法來撤銷操作。

 
public class AddTextCommand implements Command {
private TextEditor textEditor;
private String addedText;

public AddTextCommand(TextEditor textEditor, String addedText) {
this.textEditor = textEditor;
this.addedText = addedText;
}

public void execute() {
textEditor.addText(addedText);
}

public void undo() {
textEditor.deleteText(addedText);
}
}

// 類似地實(shí)現(xiàn) DeleteTextCommand
 
然后,我們創(chuàng)建接收者類 TextEditor,它包含了實(shí)際的文本編輯邏輯,包括添加文本、刪除文本和顯示文本。

 
public class TextEditor {
private StringBuilder text = new StringBuilder();

public void addText(String addedText) {
text.Append(addedText);
}

public void deleteText(String deletedText) {
int start = text.lastIndexOf(deletedText);
if (start != -1) {
text.delete(start, start + deletedText.length());
}
}

public void displayText() {
System.out.println(text.toString());
}
}
 
最后,我們可以創(chuàng)建一個(gè)客戶端來測(cè)試撤銷和重做操作:

 
public class Client {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();

Command addCommand1 = new AddTextCommand(textEditor, "Hello, ");
Command addCommand2 = new AddTextCommand(textEditor, "Design Patterns!");
Command deleteCommand = new DeleteTextCommand(textEditor, "Patterns!");

// 執(zhí)行添加和刪除操作
addCommand1.execute();
addCommand2.execute();
deleteCommand.execute();

// 顯示當(dāng)前文本
textEditor.displayText(); // 輸出: Hello, Design!

// 撤銷刪除操作
deleteCommand.undo();

// 顯示當(dāng)前文本
textEditor.displayText(); // 輸出: Hello, Design Patterns!
}
}
 
通過上述代碼,我們實(shí)現(xiàn)了撤銷和重做操作,可以在執(zhí)行操作后撤銷到之前的狀態(tài),然后再重做。這在需要保留操作歷史的應(yīng)用程序中非常有用。

總結(jié)

命令模式是一種行為型設(shè)計(jì)模式,它將請(qǐng)求和操作解耦,允許將操作封裝成獨(dú)立的命令對(duì)象。這使得我們能夠?qū)崿F(xiàn)撤銷、重做、宏命令等高級(jí)功能,并且更容易擴(kuò)展新的命令。
在設(shè)計(jì)軟件系統(tǒng)時(shí),考慮使用命令模式來提高代碼的可維護(hù)性和靈活性,特別是需要支持撤銷和重做功能的應(yīng)用程序。

分享到:
標(biāo)簽:封裝
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定