应用场景: 通常的情况下,直接new完一个类之后,然后调用这个类的办法,但是在实际的项目中存在需要存在“重做”等功能,这样就需要使用command模式来实现。 实现代码: class Program { static void Main(string[] args) { User user = new User(); user.Compute('+', 100); user.Compute('-', 50); user.Compute('*', 10); user.Compute('/', 2); user.Undo(4); user.Redo(3); Console.ReadKey(); } } interface ICommand { void Execute(); void UnExecute(); } class CalculatorCommand : ICommand { private char _operator; private int _operand; // 接受命令的对象 private Calculator _calculator; public CalculatorCommand(Calculator calculator, char @operator, int operand) { this._calculator = calculator; this._operand = operand; this._operator = @operator; } public char Operator { get { return this._operator; } set { this._operator = value; } } public int Operand { set { this._operand = value; } } // 只是调用接受命令对象去完成命令运算 public void Execute() { this._calculator.Operation(this._operator, this._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"); } } } class Calculator { private int _curr = 0; // 实际运算过程 public void Operation(char @operator, int operand) { switch (@operator) { case '+' : _curr += operand; break; case '-' : _curr -= operand; break; case '*' : _curr *= operand; break; case '/' : _curr /= operand; break; default : break; } // ends switch Console.WriteLine( "Current value = {0,3} (following {1} {2})", _curr, @operator, operand); } } // 这个类来联系command和calculator,实现redo和undo的 class User { private Calculator _calculator = new Calculator(); // 存储所有命令 private List<ICommand> _commands = new List<ICommand>(); private int _current = 0; public void Redo (int levels) { Console.WriteLine("/n---- Redo {0} levels ", levels); // Perform redo operations for (int i = 0; i < levels; i++) { if (_current < _commands.Count - 1) { ICommand command = _commands[_current++]; command.Execute(); } } } public void Undo(int level) { Console.WriteLine("/n---- Undo {0} levels ", level); // Perform undo operations for (int i = 0; i < level; i++) { if (_current > 0) { ICommand command = _commands[--_current] as ICommand; command.UnExecute(); } } } public void Compute(char @operator, int operand) { // Create command operation and execute it ICommand command = new CalculatorCommand( _calculator, @operator, operand); command.Execute(); // Add command to undo list _commands.Add(command); _current++; } }