首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

合适使用命令模式的情景

2012-09-09 
适合使用命令模式的情景情景1.当借个类都拥有一个相似的方法时,可以考虑为这些类定义一个接口,然后就可以

适合使用命令模式的情景
情景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.} 

热点排行