简介
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(简化: 将请求封装成对象,将动作请求者和动作执行者解耦。)
实际应用场景
假设现在有电视、电脑、电灯等家电,现在需要你做个遥控器控制所有家电的开关,要求做到每个按钮对应的功能供用户个性化,对于新买入家电要有非常强的扩展性
UML
代码实现
/**
* 命令执行器接口
*
* @author xiaoy
* @since 2021-3-8 8:51
*/
public interface Command {
void execute();
}
/**
* @author xiaoy
* @since 2021-3-8 8:52
*/
public class SqlCrud {
public void query() {
System.out.println("query...");
}
public void create() {
System.out.println("create...");
}
public void delete() {
System.out.println("delete...");
}
public void update() {
System.out.println("update...");
}
}
/**
* @author xiaoy
* @since 2021-3-8 8:55
*/
public class SqlCrudCreateCommand implements Command {
private SqlCrud sqlCrud;
public SqlCrudCreateCommand(SqlCrud sqlCrud) {
this.sqlCrud = sqlCrud;
}
@Override
public void execute() {
sqlCrud.create();
}
}
/**
* @author xiaoy
* @since 2021-3-8 8:55
*/
public class SqlCrudDeleteCommand implements Command {
private SqlCrud sqlCrud;
public SqlCrudDeleteCommand(SqlCrud sqlCrud) {
this.sqlCrud = sqlCrud;
}
@Override
public void execute() {
sqlCrud.delete();
}
}
/**
* @author xiaoy
* @since 2021-3-8 8:55
*/
public class SqlCrudQueryCommand implements Command {
private SqlCrud sqlCrud;
public SqlCrudQueryCommand(SqlCrud sqlCrud) {
this.sqlCrud = sqlCrud;
}
@Override
public void execute() {
sqlCrud.query();
}
}
/**
* @author xiaoy
* @since 2021-3-8 8:55
*/
public class SqlCrudUpdateCommand implements Command {
private SqlCrud sqlCrud;
public SqlCrudUpdateCommand(SqlCrud sqlCrud) {
this.sqlCrud = sqlCrud;
}
@Override
public void execute() {
sqlCrud.update();
}
}
测试
如果需要添加新的命令,只需要添加Command
的实现类,不用在去修改其它的实现类。