編程語言 php java

java設計模式-命令模式Command

java HTML我幫您 1年前  0次瀏覽
命令模式(Command Pattern)是一種數據驅動的設計模式和屬于行為模式類別。一個請求是作為命令包裹在一個對象并且傳遞給調用程序對象。調用程序對象尋找可以處理此命令并傳遞命令到對應的對象,該對象執行該命令。

命令模式是關于怎樣處理一個對象請求到另一個對象調用其方法完成某項任務的一種成熟的模式,這里稱提出請求的對象為請求者,被請求的對象為接收者。在命令模式中,當一個對象請求另一個對象其調用方法時,不和被請求的對象直接打交道,而是把這這種請求封裝到一個命令的對象中,起封裝的手段是將請求封裝在命令對象的一個方法中。命令模式的核心就是使用命令對象來封裝方法調用。既請求者的請求,接受者調用方法。


結構:
命令者模式包括四種角色
接收者:接受者是一個類的實例,該實例負責執行與請求相關的操作
命令:命令是一個接口,規定了用來封裝請求的若干個方法。
具體命令:具體命令是實現命令接口的類的實例,具體命令必須實現命令接口中的方法。
請求者:請求者是一個包含”命令接口“變量的類的實例。請求者中的”命令“接口的變量可以存放任何具體命令的引用,請求者負責調用具體命令,讓具體命令執行那些封裝了請求的方法
舉例:
public interface Command {
public void execute();
}

package com.html580.command;

/**
* 接受者:具體執行命令的人
*/
class Receiver {

public void sendMessage() {
System.out.println("保證完成任務");
}
}


/**
* 請求者
*/
class Invoker {

Command command;

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

}

/**
* 具體命令
*/
class ConcreteCommand implements Command{

Receiver receiver;

public ConcreteCommand(Receiver receiver) {
this.receiver = receiver;
}

@Override
public void execute() {
receiver.sendMessage();
}
}

public class Client {
public static void main(String<> args) {
Receiver receiver = new Receiver(); // 執行者
Command command = new ConcreteCommand(receiver); // 命令和具體命令
Invoker invoker = new Invoker(); // 請求者
invoker.startExceuteCommand(command); // 請求者下達命令
}
}

宏命令:
宏命令也是一個具體的命令,只不過他包含了其他命令的引用。當一個宏命令執行其execute方法時,將導致所引用的其他命令執行,因此執行一個宏命令相當于執行了多具體命令。


請求者輸入英文字母或1-n之間的偶數可以請求既輸出英文字母表,又輸出1-n之間的數。
首先設計兩個接收者,一個是輸出英文字母表,一個是輸出1-n之間的數
package com.html580.command;

import java.util.ArrayList;

class PrintLetter {

public void printEnglish() {
for (char c = 'a'; c <= 'z'; c++) {
System.out.print(" " + c);
}
}
}

class PrintNumber {

int n;

public PrintNumber(int n) {
this.n = n;
}

public void printNumber() {
for (int i = 0; i <= n; i++) {
System.out.print(" " + i);
}
}
}


class PrintEnglishCommand implements Command {

PrintLetter letter;

public PrintEnglishCommand(PrintLetter letter) {
this.letter = letter;
}

@Override
public void execute() {
letter.printEnglish();
}
}

class PrintNumberCommand implements Command {

PrintNumber number;

public PrintNumberCommand(PrintNumber number) {
this.number = number;

}

@Override
public void execute() {
number.printNumber();
}
}

class MacroCommand implements Command {

ArrayList commandList;

public MacroCommand(ArrayList commandList) {
this.commandList = commandList;
}

@Override
public void execute() {
for (Command command : commandList) {
command.execute();
}
}

}

class RequestPerson {

Command command;

public Command getCommand() {
return command;
}

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

public void startExecuteCommand() {
command.execute();
}
}

public class Client3 {
public static void main(String<> args) {
ArrayList commandList = new ArrayList();
RequestPerson person = new RequestPerson();
Command englishCommand = new PrintEnglishCommand(new PrintLetter());
Command numberCommand = new PrintNumberCommand(new PrintNumber(10));
commandList.add(englishCommand);
commandList.add(numberCommand);
Command macroCommand = new MacroCommand(commandList);
person.setCommand(macroCommand);
person.startExecuteCommand();

}
}



命令者模式的優點
1、在命令者模式中,請求者不直接與接受者互交,既請求者不包含接受者的引用,因此徹底消除了彼此之間的耦合。
2、命令者模式滿足了軟件的“開-閉原則”。如果增加新的具體命令和該命令的接受者,不必修改調用者的代碼,調用者就可以直接使用新的命令對象。反之如果增加新的調用者,不必修改現有的具體命令和接受者。新增加的調用者就可以使用已有的具體命令
3、由于請求者的請求被封裝到了具體命令中,那么就可以將具體命令保存到持久化媒介中,在需要的時候重新執行這個具體命令。因此使用命令者模式可以記錄日志
4、使用命令者模式可以對請求者的請求進行排隊,每個請求者各自對應一個具體命令,因此可以按一定的順序執行這些命令。
適用命令者模式的場景
1、程序需要在不同的時刻指定,排列和執行請求
2、程序需要提供撤銷操作
3、程序需要支持宏操作




發表評論

经典黑杰克游戏