这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。
可以将系统中的相关操作抽象成命令,使调用者与实现者相关分离。
【抽象命令角色
】,代码如下:
package com.example.designmodedemo.principle.command; /** * 抽象命令 */ public interface ICommand { void exec(); }
【接收者角色
】,代码如下:
package com.example.designmodedemo.principle.command; /** * 接收者:接收命令,执行命令相关操作 */ public class CommandRec { public void action(){ System.out.println(":> 接收者执行命令。"); } }
【具体命令角色
】,代码如下:
package com.example.designmodedemo.principle.command; /** * 具体命令:实现抽象命令接口 */ public class ImlCommand implements ICommand{ private CommandRec receiver;// 接收者对象 public ImlCommand(CommandRec receiver) { this.receiver = receiver; } @Override public void exec() { if (receiver != null){ receiver.action(); } } }
【调用者角色
】,代码如下:
package com.example.designmodedemo.principle.command; /** * 调用者:通过命令对象执行请求 */ public class Invoker { private ICommand iCommand; public Invoker(ICommand iCommand) { this.iCommand = iCommand; } public ICommand getiCommand() { return iCommand; } public void setiCommand(ICommand iCommand) { this.iCommand = iCommand; } public void call(){ System.out.println(":> 调用者开始执行命令..."); iCommand.exec(); } }
【客户端
】,调用代码如下:
/** * 命令模式 */ private void principle_command() { ICommand iCommand = new ImlCommand(new CommandRec());// 创建具体命令对象 Invoker invoker = new Invoker(iCommand);// 调用者 invoker.call();// 客户端访问调用者 invoker 的 call() 方法 }
【运行结果
】,如下图:
当系统的某项操作具备命令语义,且命令实现不稳定(变化)时,可以通过命令模式解耦请求与实现。使用抽象命令接口使请求方的代码架构稳定,封装接收方具体命令的实现细节。接收方与抽象命令呈现弱耦合(内部方法无需一致),具备良好的扩展性。
技术永不眠!我们下期见!