首页 > 其他分享 >实验16:命令模式

实验16:命令模式

时间:2024-11-13 09:10:56浏览次数:1  
标签:undo form 16 int calculator value 实验 模式 public

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解命令模式的动机,掌握该模式的结构;

2、能够利用命令模式解决实际问题。

 

[实验任务一]:多次撤销和重复的命令模式

某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。

实验要求:

1. 提交类图;

2. 提交源代码;

3. 注意编程规范。

1、类图

 

源代码

package org.example;

import java.util.Stack;
public abstract class AbstractCommand {
    public abstract int execute(int value);
    public abstract int undo();
    public abstract int redo();
}

package org.example;

// 具体的加法命令
public class AddCommand implements Command {
    private int value;
    private Calculator calculator;

    public AddCommand(Calculator calculator, int value) {
        this.calculator = calculator;
        this.value = value;
    }

    @Override
    public void execute() {
        calculator.add(value);
    }

    @Override
    public void undo() {
        calculator.add(-value); // 撤销操作,执行反向加法
    }
}

package org.example;

public class Adder {
     private int num =0;
     public int add(int value) {
        num+=value;
        return num;
     }
}

package org.example;

// 计算器类
public class Calculator {
    private int total = 0;

    public void add(int value) {
        total += value;
    }

    public int getTotal() {
        return total;
    }
}

package org.example;

import java.util.Stack;

public class CalculatorForm {
    private Command currentCommand;
    private Stack<Command> undoStack = new Stack<>();
    private Stack<Command> redoStack = new Stack<>();
    private Calculator calculator = new Calculator();

    // 设置当前命令
    public void setCommand(Command command) {
        this.currentCommand = command;
    }

    // 执行计算
    public void compute(int value) {
        AddCommand command = new AddCommand(calculator, value);
        command.execute();  // 执行加法
        System.out.println("计算结果: " + calculator.getTotal());
        undoStack.push(command);  // 将命令添加到撤销栈
        redoStack.clear();  // 清空重做栈
    }

    // 撤销操作
    public void undo() {
        if (!undoStack.isEmpty()) {
            Command command = undoStack.pop();
            command.undo();  // 执行撤销操作
            redoStack.push(command);  // 将命令推到重做栈
            System.out.println("撤销后结果: " + calculator.getTotal());
        } else {
            System.out.println("没有可以撤销的操作!");
        }
    }

    // 恢复操作
    public void redo() {
        if (!redoStack.isEmpty()) {
            Command command = redoStack.pop();
            command.execute();  // 执行重做操作
            undoStack.push(command);  // 将命令推到撤销栈
            System.out.println("恢复后结果: " + calculator.getTotal());
        } else {
            System.out.println("没有可以重做的操作!");
        }
    }
}

package org.example;

public class Client {
    public static void main(String[] args) {
        CalculatorForm form = new CalculatorForm();

        // 进行计算
        System.out.println("------计算过程------");
        form.compute(1); // 结果: 1
        form.compute(2); // 结果: 3
        form.compute(3); // 结果: 6
        form.compute(4); // 结果: 10

        // 多次撤回
        System.out.println("------撤回过程------");
        form.undo(); // 结果: 6
        form.undo(); // 结果: 3
        form.undo(); // 结果: 1
        form.undo(); // 结果: 0
        form.undo(); // 没有可以撤销的操作

        // 多次恢复
        System.out.println("------恢复过程------");
        form.redo(); // 结果: 1
        form.redo(); // 结果: 3
        form.redo(); // 结果: 6
        form.redo(); // 结果: 10
        form.redo(); // 没有可以重做的操作
    }
}

package org.example;

// 命令接口
public interface Command {
    void execute();
    void undo();
}

 

3、运行截图

 

 

标签:undo,form,16,int,calculator,value,实验,模式,public
From: https://www.cnblogs.com/yuanxinglan/p/18543057

相关文章

  • 实验17:解释器模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解解释器模式的动机,掌握该模式的结构;2、能够利用解释器模式解决实际问题。 [实验任务一]:解释器模式某机器人控制程序包含一些简单的英文指令,其文法规则如下:expression::=directionactiondistance|compos......
  • 外观模式
    [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。......
  • 上机实验:数据准备与模型评估
    1、实验目的熟悉Python的基本操作,掌握对数据集的读写实现、对模型性能的评估实现的能力;加深对训练集、测试集、N折交叉验证、模型评估标准的理解。2、实验内容(1)利用pandas库从本地读取iris数据集;(2)从scikit-learn库中直接加载iris数据集;(3)实现五折交叉验证进行模型......
  • 环境变量提权实验
    环境变量提权PATH是Linux和Unix操作系统中的环境变量,它指定所有存储可执行程序的bin和sbin目录。当用户在终端中执行任何命令时,它会通过PATH变量来响应用户执行的命令,并向shell发送请求以搜索可执行文件。超级用户通常还具有/sbin和/usr/sbin目录,以便系统管理命令的执行。环......
  • 点云学习笔记16——提取点云的边界,填充边界
    #include<iostream>#include<algorithm>#include<pcl/io/pcd_io.h>#include<pcl/point_types.h>#include<pcl/visualization/pcl_visualizer.h>voidBoundaryExtraction(pcl::PointCloud<pcl::PointXYZ>::Ptrcloud,pcl::Poi......
  • redis集群搭建 - cluster模式
    概述搭建一套rediscluster集群。架构192.168.0.21:6379主192.168.0.23:6380从192.168.0.22:6379主192.168.0.21:6380从192.168.0.23:6379主192.168.0.22:6380从修改这三台服务器的host文件(选做)vim/etc/hosts192.168.0.21node1192.168.0.22node2192.168.......
  • 题解:[SCOI2016] 美味
    前置知识:可持久化线段树(主席树)洛谷3293[SCOI2016]美味问题有一个长度为\(n\)的序列\(a_1,a_2,...,a_n\)。每次询问给你\(b\)、\(x\),你需要求出\(\max\{a_i+x\bigoplusb\}\)。\(1\lel\ler\len\le2\times10^5,0\lea_i,b,x<10^5\)首先,有\(l,r\)应该......
  • 大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)
           ......
  • 2024.11.12 1632版
    起于《海奥华预言》的思考◆地球管理结构和参考持续更新中...... 英文地址:https://github.com/zhuyongzhe/Earth/tags中文地址:https://www.cnblogs.com/zhuyongzhe85作者:朱永哲 ---------------------------------------------------------------------------------......
  • 数据采集实验四
    作业一(1)实验内容要求熟练掌握Selenium查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。使用Selenium框架+MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。候选网站东方财富网输出信息MYSQL......