命令模式例题——计算器(撤销、恢复)

在这里插入图片描述

执行者类:

public class Calculator {

	private int total=0;
	public void operation(char operator,int operand) {
		switch(operator) {
		case '+':total+=operand;break;
		case '-':total-=operand;break;
		case '*':total*=operand;break;
		case '/':total/=operand;break;
		}
		System.out.println(operator+" "+operand+" ="+total);
	}
}

抽象命令类:

public abstract class Command {

	public abstract void execute();
	public abstract void unexecute();
}

计算命令类:

public class CalculatorCommand extends Command {

	private Calculator calculator;
	private char operator;
	private int operand;
	
	CalculatorCommand(Calculator calculator, char operator, int operand) {
		super();
		this.calculator = calculator;
		this.operator = operator;
		this.operand = operand;
	}

	public Calculator getCalculator() {
		return calculator;
	}

	public void setCalculator(Calculator calculator) {
		this.calculator = calculator;
	}

	public char getOperator() {
		return operator;
	}

	public void setOperator(char operator) {
		this.operator = operator;
	}

	public int getOperand() {
		return operand;
	}

	public void setOperand(int operand) {
		this.operand = operand;
	}

	@Override
	public void execute() {
		calculator.operation(operator, operand);

	}

	@Override
	public void unexecute() {
		calculator.operation(undo(operator), operand);

	}

	/**
	 * @param operator2
	 * @return
	 */
	private char undo(char operator2) {
		char ch = 0;
		switch(operator2) {
		case '+':ch='-';break;
		case '-':ch='+';break;
		case '*':ch='/';break;
		case '/':ch='*';break;
		}
		return ch;
	}
}

通知命令给执行者:

public class Invoker {

	private Calculator calculator=new Calculator();
	private ArrayList<Command> commands=new ArrayList<Command>();
	private int current=0;
	public void redo(int levels) {
		System.out.println(levels);
		for(int i=0;i<levels;i++) {
			if(current<commands.size()-1) {
				commands.get(i).execute();
				current++;
			}
		}
	}
	public void undo(int levels) {
		System.out.println(levels);
		for(int i=0;i<levels;i++) {
			if(current>0) {
				--current;
				commands.get(i).execute();
			}
		}
	}
	public void compute(char operator,int operand) {
		Command command =new CalculatorCommand(calculator, operator, operand);
		command.execute();
		commands.add(command);
		current++;
	}
}

客户端:

public class Client {

	public static void main(String[] args) {
		Invoker invoker=new Invoker();
		invoker.compute('+', 100);
		invoker.compute('-', 50);
		invoker.compute('*', 20);
		invoker.compute('/', 2);
		
		invoker.redo(2);
		invoker.undo(1);
	}
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值