命令模式:通过封装一组完全不相关的对象相互之间的的交互及通讯来完成松耦合。允许某一个对象的行为的变化是独立于其他对象的。
优点
1.降低对象之间的耦合度。
2.新的命令可以很容易地加入到系统中。
3.可以比较容易地设计一个组合命令。
4.调用同一方法实现不同的功能
缺点
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。
适用情况
1.系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
2.系统需要在不同的时间指定请求、将请求排队和执行请求。
3.系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
4.系统需要将一组操作组合在一起,即支持宏命令。
● Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
● ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)。
● Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
● Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。
public class Recevier { //摊主 public void action() { System.out.println("执行操作"); } }
public abstract class Command { //任务接口 protected Recevier recevier; public Command(Recevier recevier) { this.recevier = recevier; } abstract public void execute(); }
public class ConcreteCommand extends Command { //具体实现 public ConcreteCommand(Recevier recevier) { super(recevier); } @Override public void execute() { recevier.action(); } }
public class Invoker { //帮手 private Command commands; //设置订单 public void setOrder(Command command) { this.commands = command; } public void executeCommand() { commands.execute(); } }
public class Client { //客户端 public static void main(String[] args) { Recevier receiver = new Recevier(); Command command = new ConcreteCommand(receiver); Invoker invoker = new Invoker(); invoker.setOrder(command); invoker.executeCommand(); } }执行操作