Tôi hiện đang nghiên cứu các mẫu thiết kế và hiện tôi đang xem mẫu lệnh.Trong C# làm cách nào để triển khai đúng Mẫu Thiết kế Lệnh?
Đây là mã hiện tại của tôi:
// this is the receiver
class Calculator : IReceiver
{
int x;
int y;
CommandOptions command;
public Calculator(int x, int y)
{
this.x = x;
this.y = y;
}
public void SetAction(CommandOptions command)
{
this.command = command;
}
public int GetResult()
{
int result = 0;
switch(this.command)
{
case CommandOptions.ADD:
result = this.x + this.y;
break;
case CommandOptions.SUBTRACT:
result = this.x - this.y;
break;
case CommandOptions.MULTIPLY:
result = this.x * this.y;
break;
}
return result;
}
}
// command
abstract class Command
{
protected IReceiver receiver;
public Command(IReceiver receiver)
{
this.receiver = receiver;
}
public abstract int Execute();
}
class AddCommand : Command
{
public AddCommand(IReceiver receiver) : base(receiver)
{
}
public override int Execute()
{
reciever.SetAction(CommandOptions.ADD);
return receiver.GetResult();
}
}
enum CommandOptions
{
ADD,
SUBTRACT,
MULTIPLY
}
interface IReceiver
{
void SetAction(CommandOptions command);
int GetResult();
}
class Program
{
static void Main(string[] args)
{
IReceiver receiver = new Calculator(500, 25);
//#Issue:The SetAction() method of the receiver is accessible.
//receiver.SetAction(CommandOptions.ADD);
receiver.SetAction(CommandOptions.MULTIPLY);
Command command = null;
Console.Write("Enter option 1-3: ");
int commandOption = int.Parse(Console.ReadLine());
switch(commandOption)
{
case 1:
command = new AddCommand(receiver);
break;
case 2:
command = new SubtractCommand(receiver);
break;
case 3:
command = new MultiplyCommand(receiver);
break;
default:
command = new AddCommand(receiver);
break;
}
Console.WriteLine(command.Execute());
Console.ReadKey();
}
}
Chú ý rằng trong phương pháp chính của tôi, tôi có thể truy cập vào các phương pháp SetAction
của người nhận có khả năng thiết lập mà lệnh để sử dụng.
Câu hỏi của tôi là: việc triển khai của tôi có vi phạm mục đích của mẫu lệnh và việc triển khai của tôi sai do tôi có thể truy cập vào mã khách hàng của mình không? Nếu có, làm thế nào tôi có thể cải thiện việc triển khai này.
Tại sao rigamarole với CommandOptions enum và phương thức Calculator.GetResult() phức tạp? –
Bạn có thể thấy liên kết này hữu ích, cả cho mẫu Lệnh và cho các mẫu thiết kế khác mà bạn đã làm việc thông qua: http://www.dofactory.com/Patterns/PatternCommand.aspx. –
Tôi khuyến khích bạn đọc những bài viết này ... [.NET Junkie Command Architecture] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91) và [.NET Junkie Query Kiến trúc] (http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=92) – TylerOhlsen