第16章 命令模式

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// 抽象命令类(定义每个具体命令被执行的入口方法)
abstract class AbstractCommand { public abstract void execute(); }
//具体命令类01(构造函数的参数决定该命令由哪个接收者执行)
class Command01 extends AbstsractCommand { private AbstractReceiver receiver = null; public Command01(AbstractReceiver receiver) { this.receiver = receiver; } public void execute() { System.out.println("命令01 被发布 ..."); receiver.doJob(); } }
//具体命令(最小化命令类) class MinimizeCommand extends Command { private WindowHanlder whObj; //维持对请求接收者的引用 public MinimizeCommand() { whObj = new WindowHanlder(); } //命令执行方法,将调用请求接收者的业务方法 public void execute() { whObj.minimize(); } }
//请求接收者(窗口处理类) class WindowHanlder { public void minimize() { System.out.println("将窗口最小化至托盘!"); } } //请求接收者(帮助文档处理类) class HelpHandler { public void display() { System.out.println("显示帮助文档!"); } }
//具体命令类02
class Command02 extends AbstractCommand { private AbstractReceiver receiver = null; public Command02(AbstractReceiver receiver) { this.receiver = receiver; } public void execute() { System.out.println("命令02 被发布 ..."); this.receiver.doJob(); } }
体活的)
4. 调用者(Invoker):传递命令的
5. 客户(Client):创建具体命令对象并设定它的接收者
(发布命令的)
命令模式示例代码
//抽象接收者(定义每个接收者应该完成的业务逻辑 )
abstract class AbstractReceiver { public abstract void doJob(); }
public class GigaMainBoard implements MainBoardApi{ //真正的开机命令的实现 public void open(){ System.out.println("技嘉主板现在正在开机"); System.out.println("接通电源......"); System.out.println("设备检查......"); System.out.println("装载系统......"); System.out.println("机器正常运转起来......"); System.out.println("机器已经正常打开"); } }
FBSettingWindow “功能键设置”界 面类, FunctionButton 请求调用者, Command 抽象命令,具体命令类有
MinimizeCommand和HelpCommand。
请 求 接 收 者 : WindowHanlder 和
HelpHandler
//抽象命令类 abstract class Command { public abstract void execute(); } //具体命令类(帮助命令类) class HelpCommand extends Command { private HelpHandler hhObj; //维持对请求接收者的引用 public HelpCommand() { hhObj = new HelpHandler(); } //命令执行方法,将调用请求接收者的业务方法 public void execute() { hhObj.display(); } }
别名为动作(Action)模式或事务模式。
命令模式UML类图(1)
命令模式UML类图(2)
1. 命令(Command):声明执行操作的接口 2. 具体命令 (ConcreteCommand) :将一个接收者对象 绑定于一个动作;调用接收者相应的操作,以实现 命令的内容 3. 接收者(Receiver):知道如何实施与执行一个请求相 关的操作,任何类都可以作为一个接收者(负责干具
//对于命令对象,根本不知道如何开机,会转调主板对象让 //主板去完成开机的功能
this.mainBoard.open();
}
}
//机箱对象(本身有按钮,持有按钮对应的命令对象) public class Box { //开机命令对象 private Command openCommand; public void setOpenCommand(Command command){ this.openCommand = command; } /** * 提供给客户使用,接收并响应用户请求,相当于按钮被 按下触发的方法 */ public void openButtonPressed(){ //按下按钮,执行命令 openCommand.execute(); } }
//客户使用按钮 public class Client { public static void main(String[] args) { //1:把命令和真正的实现组合起来,相当于在组装机器, //把机箱上按钮的连接线插接到主板上。 MainBoardApi mainBoard = new GigaMainBoard(); OpenCommand openCommand = new OpenCommand(mainBoard); //2:为机箱上的按钮设置对应的命令,让按钮知道该干什么 Box box = new Box(); box.setOpenCommand(openCommand); //3:然后模拟按下机箱上的按钮 box.openButtonPressed(); } }
// 具体接收者01(实现自己真正的业务逻辑)
class Receiver01 extends AbstractReceiver { public void doJob() { System.out.println("接收者01 完成工作 ...\n"); } }
// 具体接收者02
class Receiver02 extends AbstractReceiver { public void doJob() { System.out.println("接收者02 完成工作 ...\n"); } }
//测Fra Baidu bibliotek类
public class Client { public static void main(String[] args) { Invoker invoker = new Invoker(); // 创建调用者 //创建一个具体命令,并指定该命令被执行的具体接收者 AbstractCommand command01 = new Command01(new Receiver01()); //给命令传送者发布一个具体命令 invoker.setCommand(command01); //命令传送者执行命令 invoker.action(); AbstractCommand command02 = new Command01(new Receiver02()); invoker.setCommand(command02); invoker.action(); } }
示 例
为 OA 系统开发一个桌面版应用程序,该应用程序
为用户提供了一系列自定义功能键,用户可以通
过这些功能键来实现一些快捷操作。
例如有的人喜欢将第一个功能键设置为“打开帮 助文档”,有的人则喜欢将该功能键设置为“最 小化至托盘” 为了让用户能够灵活地进行功能键的设置,开发 人员提供了一个“功能键设置”窗口
// 命令接口,声明执行的操作
public interface Command { public void execute(); }
// 开机命令的实现(实现Command接口) public class OpenCommand implements Command{ //持有真正实现命令的接收者: 主板对象 private MainBoardApi mainBoard = null; public OpenCommand(MainBoardApi mainBoard) { this.mainBoard = mainBoard; } public void execute() {
//负责将具体的命令传送给具体的接收者
class Invoker { private AbstractCommand command = null; public void setCommand( AbstractCommand command) { this.command = command; } public void action() { command.execute(); } }
使用命令模式来实现开机示例
机箱相当于是Invoker 机箱上的按钮就相当于是命令对象 主板相当于接收者对象
//主板的接口 public interface MainBoardApi { /** * 主板具有能开机的功能 */ public void open(); }
// 技嘉主板类,开机命令的真正实现者,在 Command 模式中 充当Receiver */
第16章 命令模式 (COMMAND)
电脑开机运行过程
① 按下启动按钮,电源开始向主板和其它设
备供电
② 主板的系统BIOS(基本输入输出系统)开
始加电后自检
③ 主板的BIOS会依次去寻找显卡等其它设备
的BIOS,并让它们自检或者初始化
④ 开始检测CPU、内存、硬盘、光驱、串口、并口、 软驱、即插即用设备等等 ⑤ BIOS 更新 ESCD (扩展系统配置数据), ESCD 是BIOS和操作系统交换硬件配置数据的一种手段
//请求发送者(功能键类) class FunctionButton { private String name; //功能键名称 private Command command; //维持一个抽象命令对象的引用 public FunctionButton(String name) { this.name = name; } public String getName() { return this.name; } //为功能键注入命令 public void setCommand(Command command) { this.command = command; } //发送请求的方法 public void onClick() { System.out.print("点击功能键:"); command.execute(); }
等前面的事情都完成后,BIOS才按照用户的配置进
行系统引导,进入操作系统里面,等操作系统装载
并初始化完毕,就出现我们熟悉的系统登录界面了。
分 析
真正完成上述工作的是主板,那么用户和主板如何发 生联系呢? 现实中,用连接线把按钮连接到主板上的,这样 当客户按下按钮的时候,就相当于发命令给主板, 让主板去完成后续的工作 从客户的角度来看,开机就是按下按钮,不管什
么样的主板都是一样的,即客户只管发出命令,
谁接收命令,谁实现命令,如何实现,客户是不
关心的
问题的抽象
客户端只是发出命令或请求,不关心请求的
真正接收者是谁,也不关心具体如何实现,
而且同一个请求的动作可以有不同的请求内
容,当然具体的处理功能也不一样
命令模式定义
将一个请求封装为一个对象,从而可用不
同的请求对客户进行参数化;
相关文档
最新文档