設計模式 – 命令模式(Command)

ü  核心:將一個請求封裝爲一個對象,從而使你可用不同的請求對客戶進行參數化;對請求排隊或記錄請求日誌,以及支持可撤銷的操作;

ü  優點1、他能夠容易地設計一個命令隊列;2、在需要的情況下,可以較容易地將命令計入日誌;3、允許接收請求的一方決定是否要否決請求;4、可以容易地實現對請求的撤銷和重做;5、由於加進新的具體命令類不影響其他的類,因此增加新的具體命令類很容易;6(最關鍵的)將請求一個操作的對象與知道怎麼執行一個操作的對象分隔開;

ü  結構圖

實例:燒烤店經營方式的模擬

Ø  燒烤員Baker 文件Baker.java

package com.yilong.designpattern.command.bake;

public class Baker {

    public void bakeMutton(int amount) {

       for(int i=0; i<amount; i++) {

           System.out.println("烤羊肉串!");

       }

    }

    public void bakeChickenWing(int amount) {

       for(int i=0; i<amount; i++) {

           System.out.println("烤雞翅!");

       }

    }

}

Ø  命令的抽象類 文件Command.java

package com.yilong.designpattern.command.bake;

public abstract class Command {

    Baker baker;

    int amount;

    public Command(Baker baker) {

       this.baker = baker;

    }

    public void setAmount(int amount) {

       this.amount = amount;

    }

    public abstract void displayCommand();

    public abstract void execute();

}

Ø  烤羊肉串的命令類 文件BakeMuttonCommand.java

package com.yilong.designpattern.command.bake;

public class BakeMuttonCommand extends Command {

    public BakeMuttonCommand(Baker baker) {

       super(baker);

    }

    @Override

    public void execute() {

       this.baker.bakeMutton(this.amount);

    }

    @Override

    public void displayCommand() {

       System.out.println("烤羊肉串!份數:" + this.amount);

    }

}

Ø  烤雞翅的命令類 文件BakeChickenCommand.java

package com.yilong.designpattern.command.bake;

public class BakeChickenWingCommand extends Command {

    public BakeChickenWingCommand(Baker baker) {

       super(baker);

    }

    @Override

    public void execute() {

       this.baker.bakeChickenWing(this.amount);

    }

    @Override

    public void displayCommand() {

       System.out.println("烤雞翅!份數:" + this.amount);

    }

}

Ø  服務員類   文件Waiter.java

package com.yilong.designpattern.command.bake;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class Waiter {

    List<Command> commands = new ArrayList<Command>();

    public void setOrder(Command command) {

       int orderNum = commands.size() + 1;

       System.out.print("訂單" + orderNum + ": ");

       command.displayCommand();

       commands.add(command);

    }

    public void giveOrder() {

       Iterator commandIterator = commands.iterator();

       while(commandIterator.hasNext()) {

           Command c = (Command)commandIterator.next();

           c.execute();

       }

       commands.removeAll(commands);

    }

}

Ø  測試類 – Client.java

package com.yilong.designpattern.command.bake;

public class Client {

    public static void main(String[] args) {

       System.out.println("----- 營業前的準備 -----");

       System.out.println("1、指定廚師!");

       Baker baker = new Baker();

       Command command1 = new BakeMuttonCommand(baker);

       Command command2 = new BakeChickenWingCommand(baker);

       System.out.println("2、指定服務員!");

       Waiter waiter = new Waiter();

       System.out.println("-----   開門營業 -----");

       System.out.println("1、接待客人!");

       System.out.println("2、服務員寫訂單 -----");

       command1.setAmount(5);

       command2.setAmount(3);

       waiter.setOrder(command1);

       waiter.setOrder(command2);

       System.out.println("----- 廚師工作中 -----");

       waiter.giveOrder();

    }

}

打印結果:

----- 營業前的準備 -----

1、指定廚師!

2、指定服務員!

-----   開門營業 -----

1、接待客人!

2、服務員寫訂單 -----

訂單1: 烤羊肉串!份數:5

訂單2: 烤雞翅!份數:3

----- 廚師工作中 -----

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤羊肉串!

烤雞翅!

烤雞翅!

烤雞翅!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章