1. 程式人生 > >java設計模式-命令模式二

java設計模式-命令模式二

定義: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