将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,委派给不同的对象执行。
命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
【角色】
- 命令角色(Command ):一个具体命令的抽象接口。
- 命令角色实现类(ConcreteCommand):具体命令本身并不实现具体的业务命令,而是会将调用委派给一个业务逻辑对象(命令接收者)去执行。
- 接收者角色(Receiver):命令传递到这里执行对应的操作。
调用者角色(Invoker):接收到命令,并执行命令,也就是命令的发动者和调用者。
/*** 工作人员(接收者角色)*/public abstract class Worker {/*** 工作内容*/public abstract void action();}
/*** 厨师*/public class CookWorker extends Worker{@Overridepublic void action() {System.out.println("厨师准备炒菜");}}
/*** 吧台*/public class CounterWorker extends Worker{@Overridepublic void action() {System.out.println("吧台准备酒水");}}
/*** 下单(命令角色)*/public abstract class Order {protected Worker worker;public Order(Worker worker) {this.worker = worker;}/*** 点餐*/public abstract void need();}
/*** 饭菜下单(命令角色实现类)*/public class MealOrder extends Order {public MealOrder(Worker worker) {super(worker);}@Overridepublic void need() {System.out.println("来一份小炒肉");worker.action();}}
/*** 酒水下单(命令角色实现类)*/public class DrinksOrder extends Order {public DrinksOrder(Worker worker) {super(worker);}@Overridepublic void need() {System.out.println("来一瓶雪碧");worker.action();}}
/*** 服务员(调用者角色)*/public class Waiter {private Order order;public void setOrder(Order order) {this.order = order;}/*** 通知后厨*/public void call() {System.out.println("收到客户下单,通知后厨....");order.need();}}
```java public class CommandTest { public static void main(String[] args) {
// 工作人员(命令接收者)Worker cookWorker = new CookWorker();Worker counterWorker = new CounterWorker();// 下单(命令)Order mealOrder = new MealOrder(cookWorker);Order drinksOrder = new DrinksOrder(counterWorker);// 服务员(命令调用者)Waiter waiter = new Waiter();waiter.setOrder(mealOrder);waiter.call();System.out.println();waiter.setOrder(drinksOrder);waiter.call();
} } ——输出—— 收到客户下单,通知后厨…. 来一份小炒肉 厨师准备炒菜
收到客户下单,通知后厨…. 来一瓶雪碧 吧台准备酒水 ```
