java設計模式-命令模式二
阿新 • • 發佈:2019-01-05
定義:Command模式也叫命令模式,是行為設計模式的一種。Command模式通過被稱為Command的類封裝了對目標物件的呼叫行為以及引數呼叫。
應用場景:在面向物件的設計過程中,一個物件呼叫另一個物件,一般情況一下的呼叫過程是:建立目標例項;設定呼叫引數;呼叫。
但在有些情況下有必要使用一個專門的類對這種呼叫過程加以封裝,我們把這種專門類稱作command類。整個呼叫過程比較複雜,或者存在諸多的這種呼叫。這時,使用Command類對該呼叫加以封裝,便於功能的再利用。
- 呼叫前後需要對呼叫類資料進行某些處理。
- 呼叫前後需要進行某些額外的處理,比如日誌,快取,記錄歷史操作等。
結構:
命令模式(Command)的參與者
1.Command
宣告執行操作的介面。
2.ConcreteCommand
將一個接收者物件綁定於一個動作。
呼叫接收者相應的操作,以實現Execute。
3.Client
建立一個具體命令物件並設定它的接收者。
4.Invoker
要求該命令執行這個請求。
5.Receiver
知道如何實現與執行一個請求相關的操作。任何類都可能作為一個接收者。
程式碼演示:
第一步:定義Command,宣告執行操作的介面
/** * @version Id: Command.java, v 0.1 2019\1\4 0004 16:31 東方小豬 Exp $$ * @author: 東方小豬 * @Desprice: */ public abstract class Command { private Peddler peddler; protected Command(Peddler peddler) { this.peddler = peddler; } public abstract void sail(); public Peddler getPeddler() { return peddler; } }
第二步:定義ConcreteCommand,將一個接收者物件綁定於一個動作。
/**
* @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 東方小豬 Exp $$
* @author: 東方小豬
* @Desprice:
*/
public class BananaCommand extends Command{
public BananaCommand(Peddler peddler) {
super(peddler);
}
@Override
public void sail() {
this.getPeddler().sailBanana();
}
}
/**
* @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 東方小豬Exp $$
* @author: 東方小豬
* @Desprice:出售蘋果
*/
public class AppleCommand extends Command{
public AppleCommand(Peddler peddler) {
super(peddler);
}
@Override
public void sail() {
this.getPeddler().sailApple();
}
}
第三步:定義Receiver,知道如何實現與執行一個請求相關的操作
/**
* @version Id: Peddler.java, v 0.1 2019\1\4 0004 16:16 東方小豬Exp $$
* @author:東方小豬
* @Desprice:超市售貨具體執行者
*/
public class Peddler {
public void sailApple(){
System.out.println("賣蘋果");
}
public void sailBanana(){
System.out.println("賣香蕉");
}
}
第四步:定義Invoker,要求該命令執行這個請求。
/**
* @version Id: Waiter.java, v 0.1 2019\1\4 0004 17:01 東方小豬Exp $$
* @author: 東方小豬
* @Desprice:服務導購員
*/
public class Waiter {
private Command command;
public Waiter(Command command) {
this.command = command;
}
public Command getCommand() {
return command;
}
public void setCommand(Command command) {
this.command = command;
}
public void serve(){
this.command.sail();
}
}
第五步:定義Clien,我們來測試一下我們的命令模式
/**
* @version Id: MainClass.java, v 0.1 2019\1\4 0004 16:19 東方小豬Exp $$
* @author:東方小豬
* @Desprice:
*/
public class MainClass {
public static void main(String[] args){
Peddler peddler=new Peddler();
Command appleCommand=new AppleCommand(peddler);
Command bananaCommand=new BananaCommand(peddler);
Waiter waiter=new Waiter(appleCommand);
Waiter waiter1=new Waiter(bananaCommand);
waiter.serve();
waiter1.serve();
}
}
賣蘋果
賣香蕉
Process finished with exit code 0