[align=center]命令模式[/align]
命令模式的核心思想是隔离了 调用者和 执行者。
对于调用者来说,通过一个命令执行接口,调用者就可以执行各种各样的命令,而无需关注命令的具体实现。
正常的程序调用过程:
A 调用者 ---- 》调用某个服务接口
示例:
[quote=""]public interface UserService {
public void User getUserById(Long userId);
public void removeUser(Long userId);
}
public class UserServiceImpl implements UserService {
@Override
public void removeUser(Long userId) {
// TODO Auto-generated method stub
}
@Override
public User getUserById(Long userId) {
// TODO Auto-generated method stub
return null;
}
}
[/quote]
调用者 获取到服务接口 ,实例化服务实现类 ---》调用
调用方式大抵为 new UserServiceImpl().getUserById(xxx);
B调用者 ---》设置命令(要调用的命令)----》调用命令执行
1. 命令接口
public interface ICommand {
public void excute();
}
2. 命令实现
public class PhoneCallCommand implements ICommand {
private final Phone phone;
private String phoneNum;
public String getPhoneNum() {
return phoneNum;
}
public PhoneCallCommand(){
phone = new Phone();
}
@Override
public void excute() {
phone.phoneCall();
}
}
3. 命令调用者
public class Invoker {
private ICommand command;
public void setCommand(ICommand command) {
this.command = command;
}
public void phoneControl( ){
command.excute();
}
}
4. 命令调用测试
public class PhoneControlTest {
@Test
public void testObatainPhoneNumber() {
// 调用者发出 获取电话号码的命名
PhoneCallCommand command = new PhoneCallCommand();
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.phoneControl();
}
}
整个调用的过程是:调用者设定要调用的命令,执行通用的调用方法,执行相应的命令。这样无论传入什么样的命令,调用者的逻辑的都不需要改变,当业务逻辑改变时只需要增加相应的Command实现即可。
通过比较我们也能够发现,命令模式也不是任何场合都适用的,在日常的web开发中,我们常常会调用一些接口,这些接口中有多种方法签名,例如增删改查等等。命令模式下的命令功能相对的单一,相当与一个方法的签名。也就是命令模式在调用发生次数较少时有很好的使用,当程序的一个接口需要封装很多的方法时,使用命令模式无疑会增加很多的Command类。这样反倒不方便了。
当然在web开发中使用命令模式也是很多的,在《hibernate实战》中hibernate的作者就介绍了一个应用命令模式构建页面展现和后台服务提供者分布式架构的例子,非常的有学习价值。
命令模式的好处很多
1 调用队列控制 ,由于所有的命令都实现统一的接口,这样就可以设定一个队列,对这些所有的命令进行控制。
2 撤销功能,命令接口里可以设定执行开关和相应方法方便的实现 撤销功能。
3 通过记录命令堆栈,做到服务的恢复就变得很容易。
命令模式的核心思想是隔离了 调用者和 执行者。
对于调用者来说,通过一个命令执行接口,调用者就可以执行各种各样的命令,而无需关注命令的具体实现。
正常的程序调用过程:
A 调用者 ---- 》调用某个服务接口
示例:
[quote=""]public interface UserService {
public void User getUserById(Long userId);
public void removeUser(Long userId);
}
public class UserServiceImpl implements UserService {
@Override
public void removeUser(Long userId) {
// TODO Auto-generated method stub
}
@Override
public User getUserById(Long userId) {
// TODO Auto-generated method stub
return null;
}
}
[/quote]
调用者 获取到服务接口 ,实例化服务实现类 ---》调用
调用方式大抵为 new UserServiceImpl().getUserById(xxx);
B调用者 ---》设置命令(要调用的命令)----》调用命令执行
1. 命令接口
public interface ICommand {
public void excute();
}
2. 命令实现
public class PhoneCallCommand implements ICommand {
private final Phone phone;
private String phoneNum;
public String getPhoneNum() {
return phoneNum;
}
public PhoneCallCommand(){
phone = new Phone();
}
@Override
public void excute() {
phone.phoneCall();
}
}
3. 命令调用者
public class Invoker {
private ICommand command;
public void setCommand(ICommand command) {
this.command = command;
}
public void phoneControl( ){
command.excute();
}
}
4. 命令调用测试
public class PhoneControlTest {
@Test
public void testObatainPhoneNumber() {
// 调用者发出 获取电话号码的命名
PhoneCallCommand command = new PhoneCallCommand();
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.phoneControl();
}
}
整个调用的过程是:调用者设定要调用的命令,执行通用的调用方法,执行相应的命令。这样无论传入什么样的命令,调用者的逻辑的都不需要改变,当业务逻辑改变时只需要增加相应的Command实现即可。
通过比较我们也能够发现,命令模式也不是任何场合都适用的,在日常的web开发中,我们常常会调用一些接口,这些接口中有多种方法签名,例如增删改查等等。命令模式下的命令功能相对的单一,相当与一个方法的签名。也就是命令模式在调用发生次数较少时有很好的使用,当程序的一个接口需要封装很多的方法时,使用命令模式无疑会增加很多的Command类。这样反倒不方便了。
当然在web开发中使用命令模式也是很多的,在《hibernate实战》中hibernate的作者就介绍了一个应用命令模式构建页面展现和后台服务提供者分布式架构的例子,非常的有学习价值。
命令模式的好处很多
1 调用队列控制 ,由于所有的命令都实现统一的接口,这样就可以设定一个队列,对这些所有的命令进行控制。
2 撤销功能,命令接口里可以设定执行开关和相应方法方便的实现 撤销功能。
3 通过记录命令堆栈,做到服务的恢复就变得很容易。