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

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. 在命令模式中, 请求者不直接与接收者交互, 即请求者不包含接收者的引用, 因此彻底消除了彼此之间的耦合.

  1. 命令模式满足”开-闭”原则. 如果增加新的具体命令和该命令的接收者, 不必修改调用者的代码, 调用者就可以使用新的命令对象; 反之, 如果增加新的调用者, 不必修改现有的具体命令和接收者, 新增加的调用者就可以使用自己已有的具体命令

3.由于请求者被封装到了具体命令中, 那么就可以将具体命令保存到持久化的媒介中, 在需要的时候, 重新执行这个具体命令. 因此使用命令模式可以记录日志.

4.使用命令模式可以对请求者的”请求”进行排队. 每个请求都各自对应一个具体命令,因此可以按照一定的顺序执行这些命令

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值