java设计模式之命令模式
2019-03-20 本文已影响3人
我有一只喵喵
一、命令模式概念
在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)。
二、模式结构
- Command
定义命令的接口,声明一系列执行的方法。比如:运行、撤销、停止开始
- ConcreteCommand
对Command接口进行实现,内部持有接收者Receiver对象(正在命令的执行者),调用接收者的功能来完成命令要执行的操作
- Receiver
接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
- Invoker
命令调用者。要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。
- Client
创建具体的命令对象,并且设置命令对象的接收者。注意这个不是我们常规意义上的客户端,而是在组装命令对象和接收者,或许,把这个Client称为装配者会更好理解,因为真正使用命令的客户端是从Invoker来触发执行。
三、类图结构概览
类图结构.png四、通过餐厅叫餐服务进行举例实现
- Command
public interface Command {
void cooking();
}
- ConcreteCommand
public class ConcreteCommand implements Command{
private Chef chef;
public OrderImpl(Chef chef){
this.chef = chef;
}
public void cooking(){
chef.cooking();
}
}
- Chef(相当于Receiver,命名真正执行者)
//厨师统一接口
public interface Chef {
void cooking();
}
//分别做不同菜种的厨师
public class 鸡蛋炒饭厨师 implements Chef {
public void cooking(){
System.out.println("我在做鸡蛋炒饭");
}
}
public class 西红柿炒饭厨师 implements Chef {
public void cooking(){
System.out.println("我在做西红柿炒饭");
}
}
- 命令请求者Invoker
public class Invoker{
private Command command;
public Invoker(Command command){
this.command = command;
}
public void cooking(){
command.cooking();
}
}
-Client
public class Client{
public void cooking(Chef chef){
Commond commond = new ConcreteCommand(chef);
Invoker invoker = new Invoker(commond);
invoker.cooking();
}
}
五、命令模式的作用
- 降低耦合度,将请求的发送者和接收者解耦。发送请求的对象只需要哦知道如何发送请求,而不必知道如何完成请求
- 新的命令可以很容易地加入到系统中。
- 可以比较容易地设计一个组合命令。
- 调用同一方法实现不同的功能