`

适合使用命令模式的情景

阅读更多
情景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.} 
分享到:
评论

相关推荐

    JAVA23种设计模式及快捷记忆

    工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式、适配器模式、装饰者模式、代理模式、外观模式、桥接模式、组合模式、享元模式、策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、...

    深入浅出设计模式(中文版)

    5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3Interpreter...

    深入浅出设计模式(中文版电子版)

    5.2CommandPattern(命令模式) 179 5.2.1定义 179 5.2.2现实中的实例——餐馆订菜 180 5.2.3C#实例——简单计算器 181 5.2.4Java实例——总开关 185 5.2.5优势和缺陷 189 5.2.6应用情景 189 5.3Interpreter...

    网络安全技术与实施-项目3--交换机安全管理与配置.pptx

    学习情景二:网络设备安全管理与配置 项目3 交换机安全管理与配置 3.1 项目背景 3.2 项目知识准备 3.3 项目实施 项目习作 网络安全技术与实施 网络安全技术与实施-项目3--交换机安全管理与配置全文共89页,当前为第1...

    别点进来! Linux 与 Mac 下有趣但毫无用处的命令

    Linux | Mac 下有趣但毫无用处的命令 引言 今天非常的有意思,在远程 linux的时候疯狂的查看当前列表时,不小心打快了。 将ls 输出成了sl 结果出现了这样的情况: 中间过程无法按q 或者 control+C来退出,第一次...

    智能家居系统介绍.pptx

    4、场景控制 (6) 自定义模式: 通过数字智能终端,你还可以自定义更多的情景模式,如:会客模式、娱乐模式等等。 DIY 二、智能家居有哪些功能? (二)家居控制 智能家居系统介绍全文共25页,当前为第13页。 5、...

    基于ZigBee网络的无线智能照明系统设计

    该系统具有上电自组网的功能,用户可以控制协调器通过路由器向该路由器节点上的任意一个终端设备发送信号,终端设备接收到命令并产生PWM信号,实现了对每一盏LED的多级调光及情景模式控制功能。阐述了实现该系统的几...

    RM-504诺基亚5530DIY固件刷机包

    情景模式 主题模式 单键拨号 设备更新 连接管理 附件设置 日历 WLAN向导 位置 在线共享 软件更新 图片浏览 屏幕截图 百度输入 桌面计时 桌面记事本 信息 文件管理 当前备忘 收音机 照相摄像 音乐播放器 录音器 时间...

    Eclipse权威开发指南3.pdf

    4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值......

    Eclipse权威开发指南1.pdf

    4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值......

    Eclipse权威开发指南2.pdf

    4.1.1 使用运行和调试命令..... 108 4.1.2 管理启动配置..... 109 4.1.3 对代码片断编辑测试窗页面中的表达式进行求值..... 111 4.2 调试...... 112 4.2.1 基本的调试活动..... 113 4.2.2 表达式求值..... 115 ...

    Reversing:逆向工程揭密

    8.10 命令参考 304 8.11 结论 306 第3部分 破解 第9章 盗版与拷贝保护 309 9.1 世界中的版权 309 9.2 社会方面 310 9.3 软件盗版 310 9.3.1 明确问题 311 9.3.2 群破解 312 9.3.3 需求 313 9.3.4 理论上不可破解的...

Global site tag (gtag.js) - Google Analytics