Nội dung
Command là mẫu thiết kế hành vi chuyển đổi các yêu cầu hoặc hoạt động đơn giản thành các đối tượng. Việc chuyển đổi cho phép thực hiện lệnh hoãn lại hoặc từ xa, lưu trữ lịch sử lệnh, v.v.
Cách sử dụng mẫu
Sử dụng: Mẫu Command khá phổ biến trong mã C#. Thông thường, nó được sử dụng như một sự thay thế cho các lệnh gọi lại để tham số hóa các phần tử UI bằng các hành động. Nó cũng được sử dụng cho các tác vụ xếp hàng, theo dõi lịch sử hoạt động, v.v.
Nhận dạng: Mẫu Command có thể nhận biết được bằng các phương thức hành vi trong kiểu trừu tượng / giao diện (sender), phương thức này gọi một phương thức trong việc triển khai một kiểu giao diện / trừu tượng khác (receiver) đã được đóng gói bởi việc thực thi lệnh trong quá trình tạo nó. Các lớp Command thường được giới hạn trong các hành động cụ thể.
Chương trình mẫu
Program.cs
using System;
namespace DesignPatterns.Command.Conceptual
{
// Giao diện Command khai báo một phương thức để thực hiện một lệnh.
public interface ICommand
{
void Execute();
}
// Một số Command có thể tự thực hiện các thao tác đơn giản.
class SimpleCommand : ICommand
{
private string _payload = string.Empty;
public SimpleCommand(string payload)
{
this._payload = payload;
}
public void Execute()
{
Console.WriteLine($"SimpleCommand: See, I can do simple things like printing ({this._payload})");
}
}
// Tuy nhiên, một số Command có thể ủy thác các hoạt động phức tạp hơn
// cho các đối tượng khác, được gọi là "receivers."
class ComplexCommand : ICommand
{
private Receiver _receiver;
// Dữ liệu ngữ cảnh, được yêu cầu để khởi chạy các phương thức của Receiver.
private string _a;
private string _b;
// Các Command phức tạp có thể chấp nhận một hoặc một số đối tượng receiver
// cùng với bất kỳ dữ liệu ngữ cảnh nào thông qua phương thức khởi tạo.
public ComplexCommand(Receiver receiver, string a, string b)
{
this._receiver = receiver;
this._a = a;
this._b = b;
}
// Các Command có thể ủy quyền cho bất kỳ phương thức nào của receiver.
public void Execute()
{
Console.WriteLine("ComplexCommand: Complex stuff should be done by a receiver object.");
this._receiver.DoSomething(this._a);
this._receiver.DoSomethingElse(this._b);
}
}
// Các lớp Receiver chứa một số logic nghiệp vụ quan trọng. Chúng biết cách thực
// hiện tất cả các loại hoạt động, liên quan đến việc thực hiện một yêu cầu.
// Trên thực tế, bất kỳ lớp nào cũng có thể đóng vai trò là Receiver.
class Receiver
{
public void DoSomething(string a)
{
Console.WriteLine($"Receiver: Working on ({a}.)");
}
public void DoSomethingElse(string b)
{
Console.WriteLine($"Receiver: Also working on ({b}.)");
}
}
// Invoker liên kết với một hoặc một số Command. Nó gửi một
// yêu cầu đến Command.
class Invoker
{
private ICommand _onStart;
private ICommand _onFinish;
// Initialize commands.
public void SetOnStart(ICommand command)
{
this._onStart = command;
}
public void SetOnFinish(ICommand command)
{
this._onFinish = command;
}
// Invoker không phụ thuộc vào các lớp command. Invoker chuyển một yêu
// cầu đến receiver gián tiếp, bằng cách thực hiện một command.
public void DoSomethingImportant()
{
Console.WriteLine("Invoker: Does anybody want something done before I begin?");
if (this._onStart is ICommand)
{
this._onStart.Execute();
}
Console.WriteLine("Invoker: ...doing something really important...");
Console.WriteLine("Invoker: Does anybody want something done after I finish?");
if (this._onFinish is ICommand)
{
this._onFinish.Execute();
}
}
}
class Program
{
static void Main(string[] args)
{
// Mã client có thể tham số hóa một invoker bằng bất kỳ lệnh nào.
Invoker invoker = new Invoker();
invoker.SetOnStart(new SimpleCommand("Say Hi!"));
Receiver receiver = new Receiver();
invoker.SetOnFinish(new ComplexCommand(receiver, "Send email", "Save report"));
invoker.DoSomethingImportant();
}
}
}
Kết quả
Invoker: Does anybody want something done before I begin?
SimpleCommand: See, I can do simple things like printing (Say Hi!)
Invoker: ...doing something really important...
Invoker: Does anybody want something done after I finish?
ComplexCommand: Complex stuff should be done by a receiver object.
Receiver: Working on (Send email.)
Receiver: Also working on (Save report.)
Để lại một bình luận