设计模式之命令模式(Command Pattern)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangchengming1/article/details/84927843
  • 命令模式定义
    命令模式是一个高内聚的模式。Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations. 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。
  • 命令模式通用类图
    在这里插入图片描述
  • 命令模式五个主要角色
    • Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。
    • ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。
    • Invoker类:调用者,负责调用命令。
    • Receiver类:接收者,负责接收命令并且执行命令。
    • Client类:最终的客户端调用类。
  • 命令模式通用代码
    通用Receiver
public abstract class Receiver {

	public abstract void dth();
}

具体的接受者

public class ConcreteReceiver1 extends Receiver{

	@Override
	public void dth() {
		// TODO
	}
}

public class ConcreteReceiver2 extends Receiver{

	@Override
	public void dth() {
		// TODO
	}
}

抽象Command类

public abstract class Command {

	public abstract void execute();
}

具体Command类

public class ConcreteCommand1 extends Command {

	private Receiver receiver;

	public ConcreteCommand1(Receiver _receiver) {
		this.receiver = _receiver;
	}

	@Override
	public void execute() {
		this.receiver.dth();
	}
}

public class ConcreteCommand2 extends Command {

	private Receiver receiver;

	public ConcreteCommand2(Receiver _receiver) {
		this.receiver = _receiver;
	}

	@Override
	public void execute() {
		this.receiver.dth();
	}
}

Invoker类

public class Invoker {

	private Command command;

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

调用场景类

public class Client {

	public static void main(String[] args) {
		
		Receiver receiver = new ConcreteReceiver1();
		
		Command command = new ConcreteCommand1(receiver);
		
		Invoker invoker = new Invoker();
		
		invoker.setCommand(command);
		
		invoker.action();
	}
}

针对以上代码可以这样子理解:命令模式本质就是对命令的封装,把一系列的操作写到一个方法中,然后供客户端调用就行了。命令模式的执行步骤应该是这样的:首先是调用者类,然后是命令类,最后是接收者类。命令模式的精髓就是:把命令的调用者与执行者分开,使双方不必关心对方是如何操作的

  • 命令模式实例类图
    其实在实际生活中有很多例子可以体现命令模式,笔者今天以小王去饭店吃饭这个例子,用命令模式实现以下。
    在这里插入图片描述

首先小王来到饭店,看完菜单进行点单,厨师收到菜单,然后开始烹饪。

  • 命令模式实例代码
    首先定义抽象接收者
/**
 * 相当于接收者
 * 
 * @author cm_wang
 *
 */
public abstract class Cook {

	/**
	 * 厨师烹饪
	 */
	public abstract void cooking();

	/**
	 * 收到菜单
	 */
	public abstract void say();
}

真实接收者CookA

public class CookA extends Cook {

	@Override
	public void cooking() {
		System.out.println("厨师A开始做饭。。。");
	}

	@Override
	public void say() {
		System.out.println("厨师A收到菜单。。。");
	}
}

抽象命令类

public abstract class Command {

	public abstract void orderList();
}

具体命令类

public class CookCommand extends Command {
	
	private Cook cook;
	
	public CookCommand(Cook _cook) {
		this.cook = _cook;
	}

	@Override
	public void orderList() {
		cook.cooking();
	}
}

Invoker类

/**
 * 相当于Invoker
 * 
 * @author cm_wang
 *
 */
public class Consumer {
	
	static void order() {
		System.out.println("小王点菜。。。");
	}

	private Command command;

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

调用类

public class Client {

	public static void main(String[] args) {
		
		Cook cook = new CookA();
		
		Command command = new CookCommand(cook);
		
		Consumer cosumer=new Consumer();
		
		Consumer.order();
		
		cook.say();
		
		cosumer.setCommand(command);
		
		cosumer.action();
	}
}

输出结果

小王点菜。。。
厨师A收到菜单。。。
厨师A开始做饭。。。

这样子就用命令模式实现了以上的例子。

  • 命令模式的优缺点
    • 命令模式封装性良好,是一种高内聚的模式。
    • 命令模式可扩展性良好。
    • 不好的地方就是当命令较多的时候很繁琐,所以还是看场景使用。
  • 命令模式总结
    • 命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。
    • 命令模式使请求本身成为一个对象,这个对象和其他对象一样可以被存储和传递。

参考书籍:设计模式之禅
实例代码放在这里

猜你喜欢

转载自blog.csdn.net/wangchengming1/article/details/84927843