`
shifulong
  • 浏览: 59183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

desgn partten : 命令模式

阅读更多

 庆祝一下,第一次用工具画图,^_^

 

应用

  1. 可做任务队列的消费,将具体的操作封装成command,由receiver通用调用execute,感觉和线程池有点像啊。
  2. 日志系统的恢复操作,execute同时调用save,将操作持久化,当机器突然broke重启,顺序的load#command然后调用undo可以恢复现场。
  3. 其他
下面是head first的一个demo&所有demo类的截图
  • controller相当一个遥控器,控制着灯的开关,门的开关等
  • controller中通过一个堆栈实现命令的撤销操作

 
public class Gate {
    public void open() {
        System.out.println("gate open,,,");
    }
    public void close() {
        System.out.println("gate close,,,");
    }
}
 
public class Light {
    public void on() {
        System.out.println("light on,,,");
    }
    public void off() {
        System.out.println("light off,,,");
    }
}
 
public interface Command {
    void execute();
    void undo();
    void save();
    void load();
}
 
public class LightOnCommand implements Command {
    private Light light;
    public LightOnCommand(Light light) {
        this.light = light;
    }
    public void execute() {
        light.on();
    }
    public void undo() {
        light.off();
    }
    public void save() {
        // TODO
    }
    public void load() {
        // TODO
    }
}
 
public class GateOpenCommand implements Command {
    private Gate gate;
    public GateOpenCommand(Gate gate) {
        this.gate = gate;
    }
    public void execute() {
        gate.open();
    }
    public void undo() {
        gate.close();
    }
    public void save() {
        // TODO
    }
    public void load() {
        // TODO
    }
}
 
public class NoCommand implements Command {
    //所有方法没有实现,表示命令没有具体执行内容
    public void execute() {
        System.out.println("no command execute,,,");
    }
    public void undo() {
        System.out.println("no command undo,,,");
    }
    public void save() {}
    public void load() {}
}
 
public class Controller {
    private Command[] commands;
    private Stack<Command> undoStack;

    public Controller(int size) {
        this.commands = new Command[size];
        for (int i = 0; i < size; i++) {
            commands[i] = new NoCommand();
        }
        undoStack = new Stack<Command>();
    }

    public void setCommand(int index, Command command) {
        Preconditions.checkElementIndex(index, commands.length);
        Preconditions.checkNotNull(command);
        commands[index] = command;
    }

    public void undoOperation() {
        if (undoStack.isEmpty()) {
            System.out.println("undo stack empty");
            return;
        }
        undoStack.pop().undo();
    }

    public void onButtonPress(int index) {
        Preconditions.checkElementIndex(index, commands.length);
        commands[index].execute();

        undoStack.push(commands[index]);
    }
}
 
public class ClientTest {

    public static void main(String[] args) {
        Light light = new Light();
        Gate gate = new Gate();

        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);

        GateOpenCommand gateOpenCommand = new GateOpenCommand(gate);
        GateCloseCommand gateCloseCommand = new GateCloseCommand(gate);

        Controller controller = new Controller(6);

        controller.setCommand(0, lightOnCommand);
        controller.setCommand(1, lightOffCommand);
        controller.setCommand(2, gateOpenCommand);
        controller.setCommand(3, gateCloseCommand);

        controller.onButtonPress(0);
        controller.onButtonPress(1);
        controller.onButtonPress(2);
        controller.onButtonPress(3);
        controller.onButtonPress(4);
        controller.onButtonPress(5);

        System.out.println();

        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
        controller.undoOperation();
    }
}

 

下面是运行结果

light on,,,
light off,,,
gate open,,,
gate close,,,
no command execute,,,
no command execute,,,

no command undo,,,
no command undo,,,
gate open,,,
gate close,,,
light on,,,
light off,,,
undo stack empty
undo stack empty

 

  • 大小: 44.8 KB
  • 大小: 102.4 KB
分享到:
评论

相关推荐

    desgn.招聘(类似公考)ssh-有文档

    标题中的“desgn....此外,通过阅读和理解源码,还可以提升对MVC模式、依赖注入、持久化策略等核心概念的理解。对于求职者来说,熟悉这样的项目将有助于提升面试竞争力,特别是对于寻求与Web开发相关的职位。

    use-design-to-solve-technical-bottlenecks-090419084944-phpapp01

    use-design-to-solve-technical-bottlenecks-090419084944-phpapp01

    python-project:使用python我的所有desgn项目

    在本项目"python-project"中,我们关注的是利用Python编程语言进行各种设计任务。Python以其易读性、简洁的语法和强大的库支持而广受欢迎,是进行数据分析、Web开发、图形用户界面设计以及自动化任务的理想选择。...

    desgn-of-clock-based-on-singlechip.rar_嵌入式/单片机/硬件编程_Others_

    本资料包“desgn-of-clock-based-on-singlechip.rar”提供了基于单片机的电子钟设计实例,主要针对初学者,旨在帮助他们理解如何利用单片机进行硬件编程,创建一个简单的电子时钟。 首先,我们需要了解单片机的基本...

    PRINCP-IN-SYS-DESGN

    创建一个简单的外壳,意味着你需要实现命令解析、环境变量处理、进程创建等功能。这涉及到对操作系统调用如`fork()`, `exec()`, `wait()`的理解,以及如何通过标准输入输出与用户交互。这个项目能让你深入理解操作...

    CCNA认证体系完整介绍

    - **获取CCNA路由和交换认证的要求**:可以通过多种途径获得,例如通过ICND2考试、CCNA综合考试、CCDA DESGN考试等。 2. **CCNA设计认证**(CCDA):此认证侧重于网络设计方面,适合那些专注于网络设计的专业人士...

    ccna重要介绍,认证考试必读

    CCDA的认证考试编号为640-863 DESGN,对应的培训课程是"Designing for Cisco Internetwork Solutions (DESGN)"。通过此课程,考生可以系统地学习到网络设计的理论和实践技能。 **CCDA 重认证** CCDA证书的有效期为...

    51CTO下载-TestKing+640-861+V30

    【51CTO下载-TestKing+640-861+V30】是针对思科认证考试的一项学习资源,特别强调了640-861(DESGN)——Designing for Cisco Internetwork Solutions(思科网络解决方案设计)的版本30.0。这个资料集合包含了专家...

    Inductor_STk4291_document_

    描述中的"power Amp Desgn stk4211 by Robert"可能是设计者的名字或一个错误,因为STK4211并未在标题中提及,但我们可以假设这里指的是STK4291的电源放大器设计。 电感器是电子电路中的基本元件之一,主要功能是...

    数据库管理系统

    fr_class.dcu、fr_desgn.dcu等可能是与数据库操作相关的组件或类库,如表单、控件或自定义设计元素。 7. 图像文件:TS.bmp可能是与数据库系统相关的图像文件,如图标、图表或其他视觉元素,用于界面设计或报告。 8...

    图书管理系统sql版

    4. "fr_class.dcu"、"fr_desgn.dcu"、"fr_cross.dcu"、"fr_dctrl.dcu"、"fr_synmemo.dcu"、"fr_e_html2.dcu":这些都是Delphi的编译单元文件,包含了特定组件或类的编译后的代码。比如,"fr_"开头的可能表示它们是...

    vue_form_design:基于Vue3.0的表单设计器

    vue_form_design 项目设置 npm install 编译和热重装以进行开发 npm run serve 编译并最小化生产 npm run build 整理和修复文件 npm run lint 自定义配置 请参阅。

    delphi课程设计

    例如,fr_class.dcu可能包含了类定义和相关函数,fr_desgn.dcu可能涉及到组件的设计和布局,fr_cross.dcu、fr_dctrl.dcu、fr_synmemo.dcu以及fr_e_html2.dcu可能分别实现了交叉表格、数据控制、同步文本编辑器和HTML...

Global site tag (gtag.js) - Google Analytics