设计模式-命令行模式
命令行模式
定义:将一个请求封装为一个对象,使发出的请求的对象和执行请求的对象分割开。这两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
顺序:请求者->命令->执行者
优点:
- 降低系统耦合度
- 扩展性好,增加或删除命令不会影响其他类
- 方便实现Undo和Redo操作,命令模式可以与备忘录模式组合使用
- 可以在现有命令的基础上,增加额外功能。
命令模式结构:
- 抽象命令类(Command):声明执行命令的接口,拥有执行命令的抽象方法 execute()
- 具体命令类(ConcreteCommand):是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
- 接收者(Receiver): 执行命令功能的相关操作,是命令对象业务的真正实现者
- 请求者(Invoker):请求发送者,它拥有很多命令对象,通过访问命令对象来执行相关请求。
使用场景:在某些场合,比如要对行为进行“记录、撤销、重做”等处理。或者认为是命令的地方。
示例场景:顾客点了一道菜,点菜这个可以当成是一个命令,顾客是请求者,厨师是接收者。
示例代码:
public interface Command {
void execute();
}
public class FoodCommand implements Command {
private Receiver receiver;
private String foodName;
public FoodCommand(String foodName) {
this.foodName = foodName;
}
public Receiver getReceiver() {
return receiver;
}
public void setReceiver(Receiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.action(foodName);
}
}
/**
* 顾客类
*/
public class Customer {
private Command command;
public Customer(Command command) {
this.command = command;
}
public void call(){
System.out.println("顾客点菜");
command.execute();
}
}
/**
* 厨师类
*/
public class Receiver {
public void action(String foodName){
System.out.println("厨师开始制作:"+foodName);
}
}
测试代码:
public class ParteenDemo {
public static void main(String[] args) throws InterruptedException, CloneNotSupportedException {
FoodCommand command=new FoodCommand("红烧茄子");
Receiver receiver=new Receiver();
command.setReceiver(receiver);
Customer customer=new Customer(command);
customer.call();
}
}
命令模式还有一种扩展,与组合模式结合,称为组合命令模式。结构如下:
书山有路勤为径,学海无涯苦作舟