歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 設計模式學習之——命令模式

設計模式學習之——命令模式

日期:2017/3/1 9:27:15   编辑:Linux編程

定義:

命令模式:將一個請求封裝為一個對象,從而使你可用冉的請求對客戶進行參數化;對請求排隊或記錄請求日志,以及支持課撤銷的操作。

UML:

 命令模式涉及到五個角色,它們分別是:

  •   客戶端(Client)角色:創建一個具體命令(ConcreteCommand)對象並確定其接收者。
  •   命令(Command)角色:聲明了一個給所有具體命令類的抽象接口。
  •   具體命令(ConcreteCommand)角色:定義一個接收者和行為之間的弱耦合;實現execute()方法,負責調用接收者的相應操作。execute()方法通常叫做執行方法。
  •   請求者(Invoker)角色:負責調用命令對象執行請求,相關的方法叫做行動方法。
  •   接收者(Receiver)角色:負責具體實施和執行一個請求。任何一個類都可以成為接收者,實施和執行請求的方法叫做行動方法。

優點:

  • 它能較容易地設計一個命令隊列
  • 在需要的情況下,可用容易的將命令記入日志
  • 允許接受請求的一方決定是否否決請求
  • 可用容易的實現對請求的撤銷和重做
  • 由於加進的具體命令類不影響其他的類,因此增加新的具體命令類很容易
  • 命令模式把請求一個操作的對象與指導怎麼執行一個操作的對象分隔開

實例:

主要實現功能:客戶打算要點兩次烤羊肉,一次烤雞肉。

package com.zcr.Command;

//燒烤人員
public class Barbecuer
{
//烤羊肉
public void BakeMutton()
{
System.out.println("烤羊肉!!");
}

//烤雞翅
public void BakeChickenWing()
{
System.out.println("烤雞翅!!");
}
}

抽象命令類

package com.zcr.Command;

public abstract class Command
{
protected Barbecuer receiver;

public Command()
{

}

public Command(Barbecuer barbecuer)
{
this.receiver = barbecuer;
}

//執行命令
abstract public void ExcuteCommand();
}

具體命令類

package com.zcr.Command;

//烤雞翅命令
public class BakeChickenWingCommand extends Command
{
public BakeChickenWingCommand(Barbecuer barbecuer)
{
//receiver 來自父類
receiver = barbecuer;
}

@Override
public void ExcuteCommand()
{
receiver.BakeChickenWing();

}

}

具體命令類

package com.zcr.Command;

//烤羊肉命令
public class BakeMuttonCommand extends Command
{
public BakeMuttonCommand(Barbecuer barbecuer)
{
//receiver 來自父類
receiver = barbecuer;
}

@Override
public void ExcuteCommand()
{
receiver.BakeMutton();

}

}

服務員類

package com.zcr.Command;

public class Waiter
{
private Command command;

//設置訂單
public void SetOrder(Command command)
{
this.command = command;
}

//通知執行
public void Notify()
{
command.ExcuteCommand();
}
}

package com.zcr.Command;

public class TestCommand
{
public static void main(String[] args)
{
//開店前准備,燒烤店實現就找好了烤肉廚師,服務員和烤肉菜單沒等客戶上門
Barbecuer boy = new Barbecuer();
Command bakeMuttonCommand1 = new BakeMuttonCommand(boy);
Command bakeMuttonCommand2 = new BakeMuttonCommand(boy);
Command bakeChiCommand = new BakeChickenWingCommand(boy);
Waiter girl = new Waiter();

//開門營業,
girl.SetOrder(bakeMuttonCommand1);
girl.Notify();
girl.SetOrder(bakeMuttonCommand2);
girl.Notify();
girl.SetOrder(bakeChiCommand);
girl.Notify();
}
}

Copyright © Linux教程網 All Rights Reserved