命令模式(command),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。
模式的职责
将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。
在面向对象的程序设计中,一个对象调用另外一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。命令模式的作用其实就是对于对象将调用目标对象的方法这一步奏进行封装和管理。
模式的适用情况
整个调用过程比较复杂,或者存在多处同类调用。这时可以对这部分封装、
调用前后需要调用参数进行某些处理。
调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。
模式的实现
//命令的抽象类
public interface Command {
//命令执行的方法
void execute();
}
//具体命令的实现
class Command1 implements Command{
//具体命令的实现
public void execute() {
System.out.println("命令1执行了");
}
}
//具体命令的实现
class Command2 implements Command{
//具体命令的实现
public void execute() {
System.out.println("命令2执行了");
}
}
//命令的接收者
public class Reciver {
//接收命令的对象
List<Command>list = new ArrayList<Command>();
//命令的加入方法
public void addCommand(Command c){
list.add(c);
}
//命令的删除方法
public void removeCommand(Command c){
list.remove(c);
}
//命令的全部执行方法(也可以通过判断选择执行或者部分执行,代码差不多)
public void doCommand(){
for(Command c:list){
System.out.println("开始调用方法");
c.execute();
}
}
}
//客户端调用
public class Client {
public static void main(String[] args) {
//接受者对象的创建
Reciver r = new Reciver();
//命令对象的创建
Command1 c1 = new Command1();
Command2 c2 = new Command2();
//命令对象添加到接受者对象的管理中
r.addCommand(c1);
r.addCommand(c2);
//执行命令
r.doCommand();
}
}
模式的优势
设计模式有很强的扩展性:Command的实现类可以扩展命令的执行,Reciver类也比较容易重写。