Command(命令)模式屬於對象行爲型模式;java
Command命令模式經過將請求自己封裝成一個對象,以期向未知的對象提出請求.而且這個對象可被存儲並像其它的對象同樣被傳遞.設計模式
實現Command模式的關鍵在於抽象出一個Command類;這個類定義了一個可執行操做的接口(抽象方法).具體的Command子類依賴一個接收都類的實例變量,在具體的Command子類實現抽象方法時調用接收者的動做以完成相應的操做.框架
㈠意圖:ide
將一個請求封裝成對象,從而使你可用不一樣的請求對客戶進行參數化;對請求排除或者記錄請求日誌;以及支持可撤銷的操做;this
-- GOF設計模式spa
功力暫時不夠,不是很懂這句話的意思.設計
㈡理解:日誌
必須向某對象提交請求;可是並不知道關於被請求的操做或請求的執行都的任何信息; 對象
好比:咱們在界面上提供一個按鈕或者菜單;咱們只是規定了要想使按鈕(菜單)執行某些動做,必須調用它的Click方法;這時咱們就能夠考慮用Command模式;和接口回調有點類似;都是將具體的執行交由客戶來完成;接口
㈢UML圖:
㈣場景描述:
考慮一個計算器模型的設計:
計算器的大體框架咱們做爲廠商能夠提供出來;一排排的按鈕和點擊這些按鈕能夠觸發一些操做;(做爲計算器模型的硬件提供商) Command(抽象類)
計算器的軟件提供商則會對計算器的具體按鈕進行封裝; 具體Command類
每個不一樣類型的Command類會執行相應的動做;進行加,減,乘,除的操做;(調用真正地處理方法)
而傳入的數據則對應每一個具體的接收者.(加1, 加2, 加3, 加4)
沒有按"="號以前就至關於維護在一個Invoker,去不斷地接收命令.
(五)代碼實現:
- /**
- * Command模式中的command抽象類
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public abstract class Command {
- protected abstract void command();
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class AddCommand extends Command {
- private AddReceiver addReceiver;
- public AddCommand(AddReceiver addReceiver)
- {
- this.addReceiver = addReceiver;
- }
- @Override
- protected void command() {
- addReceiver.add();
- }
- }
- /**
- * Command模式中的Receiver操做;知道如何實施和執行一個相關的操做;任何類均可能做爲一個接收者
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class AddReceiver {
- public void add()
- {
- System.out.println(" 加上一 ");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- *
- * @author hubert
- *
- */
- public class SubtractionCommand extends Command{
- private SubtractionReceiver subtractionReceiver;
- public SubtractionCommand(SubtractionReceiver subtractionReceiver)
- {
- this.subtractionReceiver = subtractionReceiver;
- }
- @Override
- protected void command() {
- // TODO Auto-generated method stub
- subtractionReceiver.subtract();
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- import java.util.ArrayList;
- import java.util.List;
- /**
- * @author hubert
- *
- */
- public class Invoker {
- private List<Command> commandSeq = new ArrayList<Command>();
- public List<Command> getCommandSeq() {
- return commandSeq;
- }
- public void setCommandSeq(List<Command> commandSeq) {
- this.commandSeq = commandSeq;
- }
- public List<Command> addCommand(Command command)
- {
- commandSeq.add(command);
- return commandSeq;
- }
- public List<Command> removeCommand(Command command)
- {
- if(this.commandSeq != null && this.commandSeq.contains(command))
- {
- commandSeq.remove(command);
- }
- return commandSeq;
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class SubtractionReceiver {
- public void subtract()
- {
- System.out.println(" 減小一 ");
- }
- }
- /**
- *
- */
- package com.skywares.designpattern.command;
- /**
- * @author hubert
- *
- */
- public class Client {
- /**
- * @param args
- */
- public static void main(String[] args) {
- AddReceiver addReceiver = new AddReceiver();
- Command addCommand = new AddCommand(addReceiver);
- SubtractionReceiver subtractionReceiver = new SubtractionReceiver();
- Command subCommand = new SubtractionCommand(subtractionReceiver);
- Invoker invoker = new Invoker();
- invoker.addCommand(addCommand).add(subCommand);
- for(Command command : invoker.getCommandSeq())
- {
- command.command();
- }
- }
- }