命令模式就是将一组操作得调用封装在一个对象里面,这个对象称作命令对象。
例如我们可以有一个专门用于开启、关闭电器的命令,通过调用这命令就可以开关电器。
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();
}
}
======结果======
打开微信
微信聊天
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。