文章目录
命令模式
定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。
结构:
抽象命令类角色(command):定义命令的接口,生命执行的方法
具体命令角色(concreteCommand):具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
实现者/接收者角色(receiver):接收者,真正执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
调用者/请求者(invoker)角色:要求命令对象执行请求,通常会持有命令对象,可以持有很对的命令对象。这个是客户端真正触发命令并且要求要执行的相应操作的地方,相当于使用命令对象的接口。
命令模式可以和备忘录模式结合支持撤销操作。
应用场景:
1.请求队列化
2.支持取消操作
3.当系统崩溃,能把对系统的操作功能重新执行一遍
4.在需要事务的系统
本质:封装请求
优点:
降低系统的耦合度。命令模式能够将调用操作的对象与实现该操作的对象解耦。
增加或删除命令非常方便。采用命令模式,增加与删除命令不会影响其他类,它满足开闭原则,对扩展比较灵活。
可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
方便实现undo和redo操作。命令模式可以和备忘录模式结合,实现命令的撤销与恢复。
使用场景:
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同的时间指定请求、将请求排队和执行请求。
系统需要undo和redo操作。
点餐案例:(还有个组装电脑的案例)
package 命令模式;
import java.util.ArrayList;
import java.util.List;
public class waiter {
private List<command> orders = new ArrayList<command>();
public void setorder(command c) {
orders.add(c);
}
public void removeorder(command c) {
orders.remove(c);
}
public void Notify() {
for (int i = 0; i < orders.size(); i++) {
command c = orders.get(i);
c.excutecommand();
}
}
}
package 命令模式;
public abstract class command {
protected barbecure receiver;
public command(barbecure receiver) {
this.receiver = receiver;
}
public abstract void excutecommand();
}
package 命令模式;
public class barbecure {
public void kaoyangrou() {
System.out.println("烤羊肉串");
}
public void kaojichi() {
System.out.println("烤鸡翅");
}
}