設計模式的學習(11)命令模式

命令模式

命令模式(Command Pattern):將一個請求封裝爲一個對象,從而讓咱們可用不一樣的請求對客戶進行參數化;對請求排隊或者記錄請求日誌,以及支持可撤銷的操做。命令模式是一種對象行爲型模式,其別名爲動做(Action)模式或事務(Transaction)模式。java

以下,是命令模式的結構圖,其中設計模式

  • Command 抽象命令類,通常是抽象類或者接口哦,在其中聲明瞭用於執行請求的excute()方法。
  • ConcreteCommand 具體命令類,實現抽象命令類中聲明的方法。
  • Invoker 表示調用者,也就是請求的發送者,經過命令對象執行請求。
  • Receiver 命令的執行者,具體實現對命令請求的業務處理。

爲何

簡單來講,就是爲了解耦。設計模式在建立之初就是爲了知足軟件開發的靈活性。命令模式的初衷就是將命令調用者和命令接收者解耦開。this

怎麼作

下面經過幾段Java代碼來簡單瞭解下命令模式的具體實現:spa

抽象命令類設計

/**
 * 抽象命令類
 */
public interface Command {
	void execute();
}

具體命令類日誌

package com.cn.design_pattern.command_pattern;

/**
 * 具體命令類
 * 
 * 能夠有多個,須要實現Command接口
 * 
 */
public class ConcreteCommandA implements Command {
	/*
	 * 須要持有一個執行者
	 */
	private Receiver receiver;

	public ConcreteCommandA(Receiver receiver) {
		this.receiver = receiver;
	}

	/*
	 * 重寫本身的命令執行方法,在方法中,須要經過持有的接收者對象,來調用接收者方法
	 */
	public void execute() {
		System.out.println("命令:" + getClass().getSimpleName() + "已經交給接收者:"
				+ this.receiver.getClass().getSimpleName() + "執行了!");
		receiver.DoA();

	}

}

 

package com.cn.design_pattern.command_pattern;

public class ConcreteCommandB implements Command {
	/*
	 * 須要持有一個執行者
	 */
	private Receiver receiver;

	public ConcreteCommandB(Receiver receiver) {
		this.receiver = receiver;
	}

	/*
	 * 重寫本身的命令執行方法,在方法中,須要經過持有的接收者對象,來調用接收者方法
	 */
	public void execute() {
		System.out.println("命令:" + getClass().getSimpleName() + "已經交給接收者:"
				+ this.receiver.getClass().getSimpleName() + "執行了!");
		receiver.DoB();

	}

}

接收者code

package com.cn.design_pattern.command_pattern;

/**
 * 具體接收者
 * 
 */
public class Receiver {

	public void DoA() {
		System.out.println("接收者執行了命令A");

	}

	public void DoB() {
		System.out.println("接收者執行了命令B");

	}

}

調用者對象

package com.cn.design_pattern.command_pattern;

/**
 * 調用者/請求者
 * 
 */
public class Invoker {
	/*
	 * 持有一個抽象命令對象
	 */
	private Command command;

	public Invoker(Command command) {
		this.command = command;
	}

	public void setCommand(Command command) {
		this.command = command;
	}

	/*
	 * 調用者發起調用
	 */
	public void Call() {
		command.execute();
	}

}

main方法blog

package com.cn.design_pattern.command_pattern;

public class Main {
	public static void main(String[] args) {
		Receiver receiver = new Receiver();
		Command commandA = new ConcreteCommandA(receiver);
		Invoker invokerA = new Invoker(commandA);
		invokerA.Call();

		Command commandB = new ConcreteCommandB(receiver);
		Invoker invokerB = new Invoker(commandB);
		invokerB.Call();
	}
}

執行結果接口

命令:ConcreteCommandA已經交給執行者:Receiver執行了! 執行者執行了命令A 命令:ConcreteCommandB已經交給執行者:Receiver執行了! 執行者執行了命令B

相關文章
相關標籤/搜索