设计模式之命令模式
一、命令模式是什么?
命令模式是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
对于命令模式可以这样理解,同样拿卖东西举例子,虽然订单有买和卖两种行为,但从意义上来说这两种行为不是同一方产生的,应该买家买东西,卖家卖东西,这两个行为之间没有太多的耦合,用命令模式的官方解释是这样的卖家发送买东西的命令传递给平台,平台将命令又传给了买家,买家执行卖东西的命令。
二、命令模式详解
1.命令模式组成
命令模式包含以下主要角色:
- 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
- 具体命令类(ConcreteCommand)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
- 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
- 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。
2.示例demo
用代码举例(画反了,噗):
抽象命令类订单拥有 execute()方法:
public interface Order {
void execute();
}
实现者/接收者库存具体执行买和卖的操作
public class Stock {
public void buy(){
/**
* 具体执行买的行为,用户买操作
*/
}
public void sell(){
/**
* 具体执行卖的行为,商家卖操作
*/
}
}
具体命令类:
//买的命令
public class BuyStock implements Order{
private Stock stock;
public BuyStock(Stock stock) {
this.stock = stock;
}
@Override
public void execute() {
stock.buy();
}
}
//卖的命令
public class SellStock implements Order{
private Stock stock;
public SellStock(Stock stock) {
this.stock = stock;
}
@Override
public void execute() {
}
}
调用者/请求者,接单平台,用户和商家双向的
public class Broker {
private List<Order> orderList = new ArrayList<>();
//接单平台,接收的买或卖的订单
public void takeOrder(Order order){
orderList.add(order);
}
//执行所有订单
public void placeOrders(){
orderList.forEach(order -> order.execute());
orderList.clear();
}
}
使用:
public static void main(String[] args) {
Stock stock = new Stock();
Broker broker = new Broker();
//用户发出买命令
BuyStock buyStock = new BuyStock(stock);
broker.takeOrder(buyStock);
//商家收到卖命令
SellStock sellStock = new SellStock(stock);
broker.takeOrder(sellStock);
//执行订单
broker.placeOrders();
}
总结
优点:
降低了系统的耦合度;新的命令可以很容易添加到系统中去。
缺点:
有些命令较多的情况下可能会使系统变得比较复杂。