您的位置:首页 > 编程语言 > Java开发

java设计模式学习 (1)命令模式

2017-03-09 20:05 519 查看

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.使用命令模式可以对请求者的”请求”进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java java设计模式