设计模式的学习(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

相关文章
相关标签/搜索