命令模式定义:
命令模式是一个高内聚的模式,定义为将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复功能。
命令模式的类图如下:
假设一种场景,一个公司完成一个工程需要三个部门协调完成,部门A、B、C,每一个部门完成都需要一系列方法,完成一个工程之后客户需要做修改,先找来A部门的人谈,然后再找B、再找C,时间久了客户就受不了了,他说:我只要说明我要做什么修改,我不管你们由哪几个部门配合做,我不要一个一个谈,你给我一个接口人,我把需求只给接口人讲,然后我就不管了,接口人去执行一个响应的修改命令,而这个具体的命令里面就包含了哪几个部门需要执行哪些操作。
以上的这个场景就应该用命令模式来解决
命令角色:需要执行的所有命令都在这里声明(命令)
接收者角色:该角色是真正干活的角色,命令传递到这里执行(部门A,B,C)
调用者角色:接收到命令,并执行命令(接头人)
命令模式实现:
抽象接收者:定义一组接收者
package design.command;
public abstract class Receive {
public abstract void doSomthing();
}
具体接收者1:执行具体操作
package design.command;
public class AddReceive extends Receive {
@Override
public void doSomthing() {
System.out.println("执行添加操作");
}
}
接收者2:执行具体操作
package design.command;
public class DelReceive extends Receive {
@Override
public void doSomthing() {
System.out.println("执行删除操作");
}
}
抽象命令角色:定义一组命令,将所有的接收者聚合进来
package design.command;
public abstract class Command {
AddReceive add = new AddReceive();
DelReceive del = new DelReceive();
public abstract void execute();
}
具体命令1:
package design.command;
public class AddCommand extends Command {
@Override
public void execute() {
super.add.doSomthing();
}
}
命令2:
package design.command;
public class DelCommand extends Command {
@Override
public void execute() {
super.del.doSomthing();
}
}
调用者:
package design.command;
public class Invoker {
private Command command;
public void action(){
command.execute();
}
public void setCommand(Command command){
this.command = command;
}
}
测试调用:
package design.command;
public class TestMain {
public static void main(String[] args) {
Invoker inv = new Invoker();
Command com = new DelCommand();
inv.setCommand(com);
inv.action();
}
}
命令模式的优点
类间解耦:调用者与接收者角色之间没有任何依赖关系,调用者只需要调用Command抽象类的execute方法,不需要了解底层是那个接受者(客户需求变更,只需要和接口人(Invoker)打交道,Invoker直接和Command打交道不不用管是谁来执行)
可扩展性:Command子类可以非常容易地扩展,而调用者Invoker和高层的模块Client不产生代码耦合
还有返回机制没有说,由于吃了安眠药,眼睛有点模糊了,就写到这里吧。。。
设计模式虽然不是一门技术,但是对我们平时编程与阅读API很有帮助,个人也只是皮毛重点还是应用,欢迎大神们加群一起探讨 群号:167014883