命令模式就是将一组操作得调用封装在一个对象外面,这个对象称作命令对象。
例如咱们能够有一个专门用于开启、敞开电器的命令,通过调用这命令就能够开关电器。
system start 冰箱system close 冰箱system start 空调system close 空调
那么咱们能够写一个对于电器的命令类,在创建对象的时候能够与具体电器的组合实现对具体电器的管制。
也就是咱们为您能够将system start
和system close
封装到一个对象中,而后对象能够与空调、冰箱等家电组合实现system close 空调
的性能。
在命令模式中有以下角色
- 形象命令:所有命令的父类,定义执行命令的形象接口,并且申明被调用者成员与命令绑定。
- 具体命令:实现具体的执行细节。
- 形象被调用者:定义被调用者可被调用的性能办法。
- 具体调用者:实现具体产品的被调用办法的具体细节。
- 调用者:设置具体的调用命令,并实现调用办法。
上面通过一个软件的实例来实现命令模式
形象命令
public abstract class Command { Software software; public Command(Software software) { this.software = software; } abstract void execute();}
具体命令 - 开、操作、关
public class OpenSoftwareCommand extends Command{ public OpenSoftwareCommand(Software software) { super(software); } @Override void execute() { software.open(); }}
public class OperateSoftwareCommand extends Command{ public OperateSoftwareCommand(Software software) { super(software); } @Override void execute() { software.operate(); }}
public class CloseSoftwareCommand extends Command{ public CloseSoftwareCommand(Software software) { super(software); } @Override void execute() { software.close(); }}
形象被调用者 - 软件
public interface Software { /** * 关上软件 */ void open(); /** * 操作软件 */ void operate(); /** * 敞开软件 */ void close();}
具体被调用者 - 微信
public class Wechat implements Software{ @Override public void open() { System.out.println("关上微信"); } @Override public void operate() { System.out.println("微信聊天"); } @Override public void close() { System.out.println("推出微信"); }}
调用者
public class Invoker { Command command; public Invoker() { } public void setCommand(Command command) { this.command = command; } public void execute(){ command.execute(); }}
测试
public class CommandTest { @Test public void test(){ Invoker invoker = new Invoker(); Command command = new OpenSoftwareCommand(new Wechat()); invoker.setCommand(command); invoker.execute(); command = new OperateSoftwareCommand(new Wechat()); invoker.setCommand(command); invoker.execute(); }}======后果======关上微信微信聊天