命令模式例題——計算器(撤銷、恢復)

在這裏插入圖片描述

執行者類:

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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章