设计模式 Command real-world

来源:互联网 发布:js new date精确到秒 编辑:程序博客网 时间:2024/05/16 11:24
/*******************************************************************Command Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and supportundoable operations. 参考 http://www.dofactory.com/Patterns/PatternCommand.aspx#_self1*******************************************************************/using System;using System.Collections.Generic;namespace Pattern.Command{public class MainApp{public static void Main(){User user = new User();user.Compute('+',10);user.Compute('-',100);user.Compute('*',20);user.Redo(3);Console.ReadKey();}}// Receiverclass Calculator{private int _curr = 0;public void Operation(char @operator, int operand){Console.WriteLine("{0}{1}{2}",_curr,@operator,operand);switch(@operator){case '+': _curr += operand; break;case '-': _curr -= operand; break;case '*': _curr *= operand; break;case '/': _curr /= operand; break;}}}// Commandinterface Command{void Execute();void UnExecute();}class CalculatorCommand : Command{private Calculator _calculator; // Receiver;private int _operand;private char _operator;public CalculatorCommand(Calculator calculator, char @operator, int operand){_calculator = calculator;_operand = operand;_operator = @operator;}public void Execute(){_calculator.Operation(_operator,_operand);}public void UnExecute(){_calculator.Operation(Undo(_operator),_operand);}private char Undo(char @operator){switch(@operator){case '+': return '-';case '-': return '+';case '*': return '/';case '/': return '*';default: throw new ArgumentException("@operator");}}}// Invokerclass User{private Calculator calculator = new Calculator();private List<Command> _commands = new List<Command>();int _current = 0;public void Compute(char @operator, int operand){CalculatorCommand command = new CalculatorCommand(calculator,@operator,operand);command.Execute();_commands.Add(command);_current++;}// 将命令重新再执行一遍public void Redo(int levels){Console.WriteLine("\n --- Redo {0} levels ---",levels);_current = 0;for(int i=0;i<levels;i++){if(_current < _commands.Count - 1){Command command = _commands[_current++];command.Execute();}}}public void Undo(int levels){}}}


原创粉丝点击