适合使用命令模式的情景

情景1.当借个类都拥有一个相似的方法时,可以考虑为这些类定义一个接口,然后就可以考虑使用命令模式,将这接口注入到一个命令中,在命令中进行调用注入对象的这个方法。如果含有多个命令,可以将命令抽象出来一个接口,然后再注入到一个调用者中,这样就可以根据不同请求传入一个不容的命令给调用者,然后调用调用者的统一方法就可以了。
以下引用自:
http://chjavach.iteye.com/blog/705916
定义命令接口和命令的实现
对于客户来说,开机就是按下按钮,别的什么都不想做。把用户的这个动作抽象一下,就相当于客户发出了一个命令或者请求,其它的客户就不关心了。为描述客户的命令,现定义出一个命令的接口,里面只有一个方法,那就是执行,示例代码如下:



Java代码
1./**
2. * 命令接口,声明执行的操作
3. */
4.public interface Command {
5. /**
6. * 执行命令对应的操作
7. */
8. public void execute();
9.}

有了命令的接口,再来定义一个具体的实现,其实就是模拟现实中机箱上按钮的功能,因为我们按下的是按钮,但是按钮本身是不知道如何启动电脑的,它需要把这个命令转给主板,让主板去真正执行开机功能。示例代码如下:



Java代码
1./**
2. * 开机命令的实现,实现Command接口,
3. * 持有开机命令的真正实现,通过调用接收者的方法来实现命令
4. */
5.public class OpenCommand implements Command{
6. /**
7. * 持有真正实现命令的接收者——主板对象
8. */
9. private MainBoardApi mainBoard = null;
10. /**
11. * 构造方法,传入主板对象
12. * @param mainBoard 主板对象
13. */
14. public OpenCommand(MainBoardApi mainBoard) {
15. this.mainBoard = mainBoard;
16. }
17.
18. public void execute() {
19. //对于命令对象,根本不知道如何开机,会转调主板对象
20. //让主板去完成开机的功能
21. this.mainBoard.open();
22. }
23.}



由于客户不想直接和主板打交道,而且客户根本不知道具体的主板是什么,客户只是希望按下启动按钮,电脑就正常启动了,就这么简单。就算换了主板,客户还是一样的按下启动按钮就可以了。
换句话说就是:客户想要和主板完全解耦,怎么办呢?
这就需要在客户和主板之间建立一个中间对象了,客户发出的命令传递给这个中间对象,然后由这个中间对象去找真正的执行者——主板,来完成工作。
很显然,这个中间对象就是上面的命令实现对象,请注意:这个实现其实是个虚的实现,真正的实现是主板完成的,在这个虚的实现里面,是通过转调主板的功能来实现的,主板对象实例,是从外面传进来的。

提供机箱
客户需要操作按钮,按钮是放置在机箱之上的,所以需要把机箱也定义出来,示例代码如下:



Java代码
1./**
2. * 机箱对象,本身有按钮,持有按钮对应的命令对象
3. */
4.public class Box {
5. /**
6. * 开机命令对象
7. */
8. private Command openCommand;
9. /**
10. * 设置开机命令对象
11. * @param command 开机命令对象
12. */
13. public void setOpenCommand(Command command){
14. this.openCommand = command;
15. }
16. /**
17. * 提供给客户使用,接收并响应用户请求,相当于按钮被按下触发的方法
18. */
19. public void openButtonPressed(){
20. //按下按钮,执行命令
21. openCommand.execute();
22. }
23.}





客户使用按钮
抽象好了机箱和主板,命令对象也准备好了,客户想要使用按钮来完成开机的功能,在使用之前,客户的第一件事情就应该是把按钮和主板组装起来,形成一个完整的机器。
在实际生活中,是由装机工程师来完成这部分工作,这里为了测试简单,直接写在客户端开头了。机器组装好过后,客户应该把与主板连接好的按钮对象放置到机箱上,等待客户随时操作。把这个过程也用代码描述出来,示例代码如下



Java代码
1.public class Client {
2. public static void main(String[] args) {
3. //1:把命令和真正的实现组合起来,相当于在组装机器,
4. //把机箱上按钮的连接线插接到主板上。
5. MainBoardApi mainBoard = new GigaMainBoard();
6. OpenCommand openCommand = new OpenCommand(mainBoard);
7. //2:为机箱上的按钮设置对应的命令,让按钮知道该干什么
8. Box box = new Box();
9. box.setOpenCommand(openCommand);
10.
11. //3:然后模拟按下机箱上的按钮
12. box.openButtonPressed();
13. }
14.}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值