java设计模式学习 (1)命令模式
命令模式–在许多设计中,经常涉及到一个对象请求另一个对象调用其方法达到某种目的,如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,这时就可以使用命令模式。
结构中包括4个角色:
接收者(Receiver):是一个类的实例,负责执行与请求相关的操作.
命令(Command)接口: 一个接口,规定用来封装“”请求“的若干个方法,比如execute(),undo();等
具体命令(ConcreteCommand):去实现命令接口.
请求者(Invoker):是一个包含Command接口变量的类的一个实例. 其中的Command接口变量可以存放任何具体命令的引用,负责调用具体命令,让具体命令执行那些封装了请求的方法。
模式 代码例子1:(目录的建立与撤销)
1 命令Command.java
public interface Command{
//执行方法
public void execute(String path_name);
//撤销方法
public void undo();
}
2.具体命令 DirCommand.java
import java.util.*;
public class DirCommand implements Command{
MakeDir makeDir;//含有接收者的引用
ArrayList pathList;
public DirCommand(MakeDir makeDir){
this.makeDir=makeDir;
pathList=new ArrayList();
}
public DirCommand(){}
public void execute(String path_name){
makeDir.createDir(path_name);
pathList.add(path_name);
}
public void undo(){
int n= pathList.size();
if(n>0){
String name =pathList.get(n-1);
makeDir.deleteDir(name);
pathList.remove(n-1);
}else{
System.out.println(“没有需要撤销的操作!”);
}
}
}
3.请求者Invoker.java
public class Invoker{
Command command;//存放具体命令的引用
public void setCommand(Command command){
this.command=command;
}
public void startExcuteCommand(String name){
command.execute(name);
}
public void undoCommand(){
command.undo();
}
}
4 接收者 Invoker.java
public class Invoker{
Command command;//存放具体命令的引用
public void setCommand(Command command){
this.command=command;
}
public void startExcuteCommand(String name){
command.execute(name);
}
public void undoCommand(){
command.undo();
}
}
5测试代码
public class Demo1{
public static void main(String []args){
MakeDir makedir=new MakeDir();
Command command =new DirCommand(makedir);
Invoker invoker =new Invoker();
invoker.setCommand(command);
invoker.startExcuteCommand(“F://Test1”);
invoker.startExcuteCommand(“F://Test2”);
invoker.startExcuteCommand(“F://Test3”);
invoker.undoCommand();
invoker.undoCommand();
}
}
命令模式的优点:
1. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.
- 命令模式满足”开-闭”原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令
3.由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.
4.使用命令模式可以对请求者的”请求”进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令