Java设计模式-命令模式
来源:互联网 发布:免费手机电话变音软件 编辑:程序博客网 时间:2024/05/16 14:31
命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
我们知道一个命令各对象通过在特定接收者上绑定一组动作来封装一个请求。要达到这一点,命令对象将动作和接收者包进对象中。这个对象只暴露出一个execute()方法,当此方法被调用时,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。
具体例子
所有命令对象实现相同的接口:Command.java
- package com.designpattern.command;
- public interface Command {
- public void execute();
- public void undo();
- }
- package com.designpattern.command;
- public class Light {
- private boolean on = false;
- public void on() {
- this.on = true;
- }
- public void off() {
- this.on = false;
- }
- public String getStatus() {
- if (on) {
- return "ON";
- } else {
- return "OFF";
- }
- }
- }
开灯的命令 对象:OnCommand.java,定义了动作和接收者之间的绑定关系。调用者只要调用execute()方法就可以发出请求,然后调用接收者的一个或多个动作。
- package com.designpattern.command;
- public class OnCommand implements Command {
- private Light light;
- public OnCommand(Light l) {
- this.light = l;
- }
- @Override
- public void execute() {
- light.on();
- }
- @Override
- public void undo() {
- light.off();
- System.out.println("The light is off!");
- }
- }
- package com.designpattern.command;
- public class OffCommand implements Command {
- private Light light;
- public OffCommand(Light l){
- this.light = l;
- }
- @Override
- public void execute() {
- light.off();
- }
- @Override
- public void undo() {
- light.on();
- System.out.println("The light is on!");
- }
- }
空命令:NoCommand.java,将处理null的责任转移给空命令对象,当调用它的execute()方法时,这个对象什么事情都不做。
- package com.designpattern.command;
- public class NoCommand implements Command {
- @Override
- public void execute() {
- // TODO Auto-generated method stub
- }
- @Override
- public void undo() {
- // TODO Auto-generated method stub
- }
- }
调用者:Invoker.java,持有一个命令对象,并在某个时间点调用命令对象的execute()方法,将请求付诸实行。
- package com.designpattern.command;
- //调用者
- public class Invoker {
- private Command command;
- private Command undoCommand;
- public Invoker() {
- command = new NoCommand();
- undoCommand = new NoCommand();
- }
- public void setCommand(Command c) {
- this.command = c;
- }
- public void pressButton() {
- this.command.execute();
- undoCommand = command;
- }
- public void undoPress() {
- undoCommand.undo();
- }
- }
测试类:Test.java,负责创建一个具体的命令,并设置其接收者。
- package com.designpattern.command;
- public class Test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- Light light = new Light();
- Command on = new OnCommand(light);//具体命令,light为接收者
- Command off = new OffCommand(light);
- Invoker invoker = new Invoker();
- invoker.setCommand(on);
- invoker.pressButton();
- invoker.undoPress();
- System.out.println("Light "+light.getStatus());
- }
- }
要点总结
1、命令模式将发出请求的对象和执行请求的对象解耦。
2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作。
3、调用者通过调用命令对象的execute()方法发出请求,这会使得接收者的动作被调用。
4、调用者可以接收命令当做参数,甚至在运行时动态地进行。
5、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态。
6、宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销。
7、实际操作时,很常见使用“聪明”命令对象,也就是直接实现了请求,而不是将工作委托给接收者。
8、命令也可以用来实现日志和事务系统。
0 0
- java设计模式-命令模式
- java设计模式---命令模式
- java设计模式---命令模式
- 【java 设计模式】命令模式
- Java设计模式:命令模式
- java设计模式-----命令模式
- Java设计模式-命令模式
- java设计模式---命令模式
- Java设计模式--命令模式
- Java设计模式--命令模式
- JAVA设计模式-命令模式
- java设计模式,命令模式
- JAVA设计模式--命令模式
- Java设计模式-命令模式
- java设计模式-命令模式
- Java设计模式-命令模式
- JAVA设计模式-命令模式
- JAVA 设计模式 命令模式
- 小楼一阁的数据结构学习笔记(三、单链表)
- 二叉树基本操作--java实现
- “后进先出”的栈
- Pointcut is not well-formed: expecting 'name pattern' at character position
- android快速上手(四)屏幕分辨率和单位概念浅析
- Java设计模式-命令模式
- 搭建git for windows服务器(100%可以成功)
- Spring配置SessionFactory
- 杭州支付宝招聘java开发工程师
- 提醒自己:编程时一定要注意在延时函数中延时变量i的类型!
- ios手机晃动检测,图片抖动,手机震动功能
- spring datasource 配置及事务管理
- 嵌入式 linux下以及arm下sd卡mmc的自动挂载以及自动卸载小结
- POJ2528线段树基础