[Design Patterns] 设计模式(六) 命令模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/FightFightFight/article/details/82904051

前言

在日常生活中,我们经常会遇到过这样的场景:去餐厅点餐时,只需要将菜单交给服务员,稍等片刻后就可以吃到想吃的食物了,整个过程中我们跟制作食物的厨师没有一丝的交流。这个场景放在程序中,可以说将客户和厨师进行了完全解耦,而这个场景的实现方式,就是本篇文章的主角——命令模式。

定义

命令模式可以将动作的请求者和动作的执行者进行解耦。它将命令(或请求)封装成对象,以便使用不同的请求、队列、或者日志来参数化其他对象。命令模式支持撤销操作。

使用场景

  • 1.执行队列请求:将命令对象添加到队列中,逐个进行处理(如餐厅点餐时,厨师一个一个解决订单)。
  • 2.日志请求:可以在命令对象中添加store()、restore()方法来存储/恢复调用过的命令记录。

UML类图

在这里插入图片描述

示例

这里就以餐厅点餐为例,通过命令模式实现该功能:
首先定义抽象命令接口和具体命令类:

//命令接口
public interface IOrder {

	void execute();
	void undo();
}

//火锅订单
public class HotpotOrder implements IOrder {

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		System.out.println("火锅开始搞起来。。。。");
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		System.out.println("火锅取消。。。。");
	}

}

//川菜订单
public class ChuancaiOrder implements IOrder {

	@Override
	public void execute() {
		// TODO Auto-generated method stub
		System.out.println("川菜开始搞起来。。。。");
	}

	@Override
	public void undo() {
		// TODO Auto-generated method stub
		System.out.println("川菜取消。。。。");
	}

}

然后定义一个命令的传送者(或者控制者)——服务员类:

public class Waiter {

	private IOrder order;
	private Chief chief = new Chief();
	
	public void setOrder(IOrder r) {
		this.order = r;
		chief.takeOrder(r);
	}
}

接下来定义命令接受者——厨师类:

public class Chief {

	public void takeOrder(IOrder r) {
		r.execute();
	}
}

最后,定义一个顾客,并开始点餐:

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Waiter waiter = new Waiter();
		IOrder order = new HotpotOrder();
		waiter.setOrder(order);
		order = new ChuancaiOrder();
		waiter.setOrder(order);
	}
}
/**
火锅开始搞起来。。。。
川菜开始搞起来。。。。
*/

总结

  • 1.命令模式是一种结构型设计模式;
  • 2.命令模式将命令封装成为了一个对象,将命令发出者和执行者之间进行解耦;
  • 3.命令支持撤销操作。

猜你喜欢

转载自blog.csdn.net/FightFightFight/article/details/82904051
今日推荐